ホームページ >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
Mary-Kate Olsenオリジナル
2025-01-21 18:05:13452ブラウズ

この例では、Java の InputStreamOutputStream を使用して URL から画像をダウンロードする方法を示します。 OutputStream.write() メソッドの使用法が異なる 2 つのコード スニペットが示されています。結果を分析してみましょう。

方法 1: 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>

方法 2: write(int n)

このメソッドは、出力ストリームに 1 バイトを書き込みます。 コードは誤って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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。