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?

GuruKulki
sumber
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.

Stephen C
sumber
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.

pstanton
sumber
maksud Anda - ByteArrayOutputStream out = new ByteArrayOutputStream (); sebaliknya ByteArrayOutputStream out = baru ByteArrayInputStream ();
Avihai Marchiano
CloseQuietly mungkin harus dalam klausa akhirnya.
JustinKSU
5

kita dapat mengubah byte array [] menjadi aliran input dengan menggunakan ByteArrayInputStream

String str = "Welcome to awesome Java World";
    byte[] content = str.getBytes();
    int size = content.length;
    InputStream is = null;
    byte[] b = new byte[size];
    is = new ByteArrayInputStream(content);

Untuk contoh lengkap silakan cek di sini http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html

12ram
sumber
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.

Thilo
sumber
1
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
DALDEI
sumber
0

Saya menyadari bahwa jawaban saya sudah sangat terlambat untuk pertanyaan ini, tetapi saya pikir komunitas ingin pendekatan yang lebih baru untuk masalah ini .

Simbol-Simbol
sumber
Buffer sirkular tidak menyelesaikan masalah OP. Dalam Pertanyaan sebagaimana ditulis, OP membutuhkan seluruh konten dalam array byte tunggal.
Stephen C
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.

Stas Wishnevetsky
sumber