ホームページ >Java >&#&チュートリアル >Java ByteArrayOutputStream.write(int n) と ByteArrayOutputStream.write(byte[] b, int off, int len) の違い
この例では、Java の InputStream
と OutputStream
を使用して 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
) では、データの破損により、壊れた画像または部分的にレンダリングされた画像が生成され、ファイル サイズは小さくなる可能性があります。 提供されている画像ファイルの比較は、この違いをファイル サイズの観点から視覚的に示しています。
結論として、データの整合性を確保し破損を避けるために、バイナリ データ ストリームを扱うときは常に 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 サイトの他の関連記事を参照してください。