Rumah >Java >javaTutorial >Perbezaan Java ByteArrayOutputStream.write(int n) dengan ByteArrayOutputStream.write(bait[] b, int off, int len)

Perbezaan Java ByteArrayOutputStream.write(int n) dengan ByteArrayOutputStream.write(bait[] b, int off, int len)

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-21 18:05:13452semak imbas

Contoh ini menunjukkan memuat turun imej daripada URL menggunakan InputStream dan OutputStream Java. Dua coretan kod dibentangkan, berbeza dalam penggunaan kaedah OutputStream.write(). Mari analisa hasilnya.

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

Kaedah ini menulis sebahagian daripada tatasusunan bait ke aliran keluaran. Kod ini dengan cekap membaca data dalam ketulan (1024 bait pada satu masa) daripada aliran input dan menulis ketulan yang sama ke aliran keluaran. Ini ialah cara yang betul dan cekap untuk mengendalikan data binari seperti imej.

<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>

Kaedah 2: write(int n)

Kaedah ini menulis satu bait ke aliran keluaran. Kod salah mentafsir nilai pulangan in.read(buf) (yang mewakili bilangan bait dibaca) sebagai bait tunggal yang akan ditulis. Ini membawa kepada rasuah data.

<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>

Keputusan dan Sifat Imej:

Imej yang dimuat turun menggunakan Kaedah 1 (my-image1.jpg) akan menjadi imej yang dipaparkan dengan betul dengan saiz fail yang dijangkakan. Kaedah 2 (my-image2.jpg), disebabkan oleh kerosakan data, akan mengakibatkan imej rosak atau sebahagiannya dipaparkan dengan saiz fail yang mungkin lebih kecil. Perbandingan fail imej yang disediakan menunjukkan perbezaan ini secara visual dan dari segi saiz fail.

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)

Kesimpulannya, sentiasa gunakan kaedah write(byte[] b, int off, int len) apabila berurusan dengan aliran data binari untuk memastikan integriti data dan mengelakkan rasuah. Kaedah write(int n) hanya sesuai untuk menulis bait tunggal dan tidak sesuai untuk mengendalikan ketulan data yang lebih besar.

Atas ialah kandungan terperinci Perbezaan Java ByteArrayOutputStream.write(int n) dengan ByteArrayOutputStream.write(bait[] b, int off, int len). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn