Байт [] в InputStream або OutputStream


129

У таблиці моєї бази даних у мене стовпчик blob, який я повинен використовувати byte[]в своїй програмі Java як відображення, а для використання цих даних я повинен конвертувати їх у InputStreamабо OutputStream. Але я не знаю, що відбувається всередині, коли я це роблю. Чи може хтось коротко пояснити мені, що відбувається, коли я роблю це перетворення?


2
Чи не повинен заголовок бути "масивом байтів ..." чи "байтовим масивом ..." чи "байтом [] ...", встановленим "байтом масиву ..."?
kuester2000

1
Дивіться реверс тут: stackoverflow.com/questions/1264709/…
Джей Тейлор

Відповіді:


198

Ви створюєте та використовуєте потоки вводу / виводу байтового масиву таким чином:

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

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

Якщо припустити, що ви використовуєте драйвер JDBC, який реалізує стандартний інтерфейс JDBC Blob (це не все), ви також можете підключити InputStreamабо OutputStreamдо блоку за допомогою методів getBinaryStreamі 1 , а також ви можете отримати та встановити байти безпосередньо.setBinaryStream

(Загалом, ви повинні вжити відповідних заходів для обробки будь-яких винятків та закритих потоків. Однак закриття bisта bosв наведеному вище прикладі є непотрібним, оскільки вони не пов'язані з жодними зовнішніми ресурсами; наприклад, дескриптори файлів, сокети, підключення до бази даних.)

1 - setBinaryStreamМетод насправді є геттером. Піди розберися.


13

Я припускаю, що ви маєте на увазі, що "використання" означає читання, але те, що я поясню для випадку читання, в основному може бути відмінено для випадку запису.

тож ви закінчуєте байт []. це може представляти будь-які дані, для яких можуть знадобитися особливі типи перетворень (символьні, зашифровані тощо). давайте зробимо вигляд, що хочете записати ці дані так, як у файл.

по-перше, ви можете створити ByteArrayInputStream, який в основному є механізмом для подачі байтів на щось послідовно.

тоді ви можете створити FileOutputStream для файлу, який ви хочете створити. існує багато типів InputStreams та OutputStreams для різних джерел даних та напрямків.

нарешті, ви б написали InputStream в OutputStream. у цьому випадку масив байтів буде послідовно надсилатися до FileOutputStream для запису. Для цього я рекомендую використовувати IOUtils

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

і в зворотному напрямку

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

якщо ви використовуєте наведені вище фрагменти коду, вам потрібно буде обробляти винятки, і я рекомендую вам зробити "закриття" в остаточному блоці.


Ви не мали на увазі - ByteArrayOutputStream out = new ByteArrayOutputStream (); натомість ByteArrayOutputStream out = новий ByteArrayInputStream ();
Avihai Marchiano

Закрити тихо, ймовірно, має бути остаточно застереження.
JustinKSU

5

ми можемо перетворити масив byte [] у потік введення, використовуючи 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);

Для повного прикладу перегляньте тут http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html


4

Не відбувається перетворення між InputStream / OutputStream та байтами, з якими вони працюють. Вони створені для двійкових даних і просто читають (або записують) байти один за одним, як є.

Перетворення повинно відбутися, коли ви хочете перейти від байта до знаку char. Потім вам потрібно перетворити за допомогою набору символів. Це відбувається, коли ви створюєте String або Reader з байтів, які створені для символьних даних.


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


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

Я думаю, що це краще, оскільки у вас вже є наявний OutputStream в об'єкті відповіді. немає необхідності створювати новий OutputStream.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.