Home >Java >javaTutorial >Difference Java ByteArrayOutputStream.write(int n) with ByteArrayOutputStream.write(byte[] b, int off, int len)

Difference Java ByteArrayOutputStream.write(int n) with ByteArrayOutputStream.write(byte[] b, int off, int len)

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-21 18:05:13452browse

This example demonstrates downloading an image from a URL using Java's InputStream and OutputStream. Two code snippets are presented, differing in their use of the OutputStream.write() method. Let's analyze the results.

Method 1: write(byte[] b, int off, int len)

This method writes a portion of a byte array to the output stream. The code efficiently reads data in chunks (1024 bytes at a time) from the input stream and writes those same chunks to the output stream. This is the correct and efficient way to handle binary data like images.

<code class="language-java">String val = "https://akcdn.detik.net.id/community/media/visual/2023/03/04/sholat-jenazah_169.jpeg";
URL url = new URL(val);
InputStream in = new BufferedInputStream(url.openStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;

while (-1 != (n=in.read(buf))) {
  out.write(buf, 0, n); // Correctly writes the chunk of bytes
}
out.close();
in.close();

byte[] response = out.toByteArray();
FileOutputStream fos = new FileOutputStream("D:/my-image1.jpg");
fos.write(response); // Writes the complete byte array to the file
fos.close();</code>

Method 2: write(int n)

This method writes a single byte to the output stream. The code incorrectly interprets the return value of in.read(buf) (which represents the number of bytes read) as a single byte to be written. This leads to data corruption.

<code class="language-java">String val = "https://akcdn.detik.net.id/community/media/visual/2023/03/04/sholat-jenazah_169.jpeg";
URL url = new URL(val);
InputStream in = new BufferedInputStream(url.openStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
int n = 0;

while (-1 != (n=in.read(buf))) {
  out.write(n); // Incorrectly writes only a single byte, corrupting the image data
}
out.close();
in.close();

byte[] response = out.toByteArray();
FileOutputStream fos = new FileOutputStream("D:/my-image2.jpg");
fos.write(response);
fos.close();</code>

Results and Image Properties:

The image downloaded using Method 1 (my-image1.jpg) will be a correctly rendered image with the expected file size. Method 2 (my-image2.jpg), due to the data corruption, will result in a broken or partially rendered image with a likely smaller file size. The provided image file comparisons demonstrate this difference visually and in terms of file size.

Difference Java ByteArrayOutputStream.write(int n) with ByteArrayOutputStream.write(byte[] b, int off, int len) Difference Java ByteArrayOutputStream.write(int n) with ByteArrayOutputStream.write(byte[] b, int off, int len) Difference Java ByteArrayOutputStream.write(int n) with ByteArrayOutputStream.write(byte[] b, int off, int len)

In conclusion, always use the write(byte[] b, int off, int len) method when dealing with binary data streams to ensure data integrity and avoid corruption. The write(int n) method is only suitable for writing single bytes and is inappropriate for handling larger data chunks.

The above is the detailed content of Difference Java ByteArrayOutputStream.write(int n) with ByteArrayOutputStream.write(byte[] b, int off, int len). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn