首页 > Java > java教程 > Java ByteArrayOutputStream.write(int n) 与 ByteArrayOutputStream.write(byte[] b, int off, int len) 的区别

Java ByteArrayOutputStream.write(int n) 与 ByteArrayOutputStream.write(byte[] b, int off, int len) 的区别

Mary-Kate Olsen
发布: 2025-01-21 18:05:13
原创
422 人浏览过

此示例演示使用 Java 的 InputStreamOutputStream 从 URL 下载图像。 提供了两个代码片段,其不同之处在于 OutputStream.write() 方法的使用。我们来分析一下结果。

方法一:write(byte[] b, int off, int len)

此方法将字节数组的一部分写入输出流。 该代码有效地从输入流中读取块数据(一次 1024 字节),并将这些相同的块写入输出流。这是处理图像等二进制数据的正确且有效的方法。

<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>
登录后复制

方法二:write(int n)

此方法将单个字节写入输出流。 代码错误地in.read(buf)的返回值(表示读取的字节数)解释为要写入的单个字节。这会导致数据损坏。

<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>
登录后复制

结果和图像属性:

使用方法 1 (my-image1.jpg) 下载的图像将是正确渲染的图像,具有预期的文件大小。 方法 2 (my-image2.jpg) 由于数据损坏,将导致图像损坏或部分渲染,并且文件大小可能较小。 提供的图像文件比较从视觉上和文件大小方面证明了这种差异。

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)

总之,在处理二进制数据流时始终使用 write(byte[] b, int off, int len) 方法,以确保数据完整性并避免损坏。 write(int n) 方法仅适合写入单个字节,不适合处理较大的数据块。

以上是Java ByteArrayOutputStream.write(int n) 与 ByteArrayOutputStream.write(byte[] b, int off, int len) 的区别的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板