Byte [] ke InputStream atau OutputStream


129

Saya memiliki kolom gumpalan di tabel database saya, yang saya harus gunakan byte[]dalam program Java saya sebagai pemetaan dan untuk menggunakan data ini saya harus mengubahnya menjadi InputStreamatau OutputStream. Tetapi saya tidak tahu apa yang terjadi secara internal ketika saya melakukannya. Adakah yang bisa menjelaskan secara singkat apa yang terjadi ketika saya melakukan konversi ini?


2
Bukankah seharusnya judulnya adalah "array byte ..." atau "byte array ..." atau "byte [] ..." di-instaed dari "byte array ..."?
kuester2000

1
Lihat kebalikannya di sini: stackoverflow.com/questions/1264709/…
Jay Taylor

Jawaban:


198

Anda membuat dan menggunakan stream array I / O byte sebagai berikut:

byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...

ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();

Dengan asumsi bahwa Anda menggunakan driver JDBC yang mengimplementasikan antarmuka JDBC Blob standar (tidak semua melakukannya), Anda juga dapat menghubungkan InputStreamatau OutputStreamke gumpalan menggunakan metode getBinaryStreamdan 1 , dan Anda juga bisa mendapatkan dan mengatur byte secara langsung.setBinaryStream

(Secara umum, Anda harus mengambil langkah-langkah yang tepat untuk menangani pengecualian, dan menutup aliran. Namun, menutup bisdan bosdalam contoh di atas tidak diperlukan, karena tidak terkait dengan sumber daya eksternal apa pun; mis. Deskriptor file, soket, koneksi basis data.)

1 - setBinaryStreamMetode ini sangat rajin aktif. Sosok pergi.


13

Saya berasumsi maksud Anda bahwa 'penggunaan' berarti membaca, tetapi apa yang akan saya jelaskan untuk kasus baca pada dasarnya dapat dibalik untuk kasus penulisan.

sehingga Anda berakhir dengan byte []. ini dapat mewakili segala jenis data yang mungkin memerlukan jenis konversi khusus (karakter, terenkripsi, dll). mari kita berpura-pura ingin menulis data ini seperti halnya ke file.

pertama Anda bisa membuat ByteArrayInputStream yang pada dasarnya adalah mekanisme untuk memasok byte ke sesuatu secara berurutan.

maka Anda bisa membuat FileOutputStream untuk file yang ingin Anda buat. ada banyak jenis InputStreams dan OutputStreams untuk berbagai sumber data dan tujuan.

terakhir Anda akan menulis InputStream ke OutputStream. dalam hal ini, array byte akan dikirim secara berurutan ke FileOutputStream untuk ditulis. Untuk ini saya sarankan menggunakan IOUtils

byte[] bytes = ...;//
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(new File(...));
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);

dan sebaliknya

FileInputStream in = new FileInputStream(new File(...));
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
byte[] bytes = out.toByteArray();

jika Anda menggunakan cuplikan kode di atas, Anda harus menangani pengecualian dan saya sarankan Anda melakukan 'closes' di blok akhirnya.


maksud Anda - ByteArrayOutputStream out = new ByteArrayOutputStream (); sebaliknya ByteArrayOutputStream out = baru ByteArrayInputStream ();
Avihai Marchiano

CloseQuietly mungkin harus dalam klausa akhirnya.
JustinKSU


4

Tidak ada konversi antara InputStream / OutputStream dan byte yang mereka gunakan. Mereka dibuat untuk data biner, dan hanya membaca (atau menulis) byte satu per satu apa adanya.

Konversi harus terjadi ketika Anda ingin beralih dari byte ke char. Maka Anda perlu mengonversi menggunakan set karakter. Ini terjadi ketika Anda membuat String atau Reader dari byte, yang dibuat untuk data karakter.


1
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )


0
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

Saya pikir ini lebih baik karena Anda sudah memiliki OutputStream yang ada di objek respons. tidak perlu membuat OutputStream baru.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.