Byte [] в InputStream или OutputStream

129

У меня есть столбец blob в моей таблице базы данных, который я должен использовать byte[]в своей программе Java в качестве сопоставления, и чтобы использовать эти данные, мне нужно преобразовать его в InputStreamили OutputStream. Но я не знаю, что происходит внутри, когда я это делаю. Может ли кто-нибудь вкратце объяснить мне, что происходит, когда я делаю это преобразование?

GuruKulki
источник
2
Разве заголовок не должен быть «массив байтов ...» или «байтовый массив ...» или «byte [] ...» вместо «байта массива ...»?
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и setBinaryStreamметоды 1 , и вы можете также получить и установить байты непосредственно.

(В общем, вы должны предпринять соответствующие шаги для обработки любых исключений и закрытия потоков. Однако в закрытии 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();

если вы используете приведенные выше фрагменты кода, вам нужно будет обрабатывать исключения, и я рекомендую вам сделать «закрытие» в блоке finally.

pstanton
источник
разве вы не имели в виду - ByteArrayOutputStream out = new ByteArrayOutputStream (); вместо этого ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano
CloseQuietly, вероятно, должен быть в предложении finally.
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

12cram
источник
4

Преобразования между InputStream / OutputStream и байтами, с которыми они работают, не происходит. Они созданы для двоичных данных и просто читают (или записывают) байты один за другим как есть.

Преобразование должно произойти, когда вы хотите перейти от байта к символу. Затем вам нужно преобразовать, используя набор символов. Это происходит, когда вы создаете String или Reader из байтов, которые созданы для символьных данных.

Тило
источник
1
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
DALDEI
источник
0

Я понимаю, что мой ответ на этот вопрос слишком поздно, но я думаю, что сообществу хотелось бы более новый подход к этому вопросу .

Sym-Sym
источник
Круглые буферы не решают проблему OP. В вопросе, как написано, OP требуется все содержимое в однобайтовом массиве.
Stephen C
0
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

Я думаю, это лучше, поскольку у вас уже есть OutputStream в объекте ответа. нет необходимости создавать новый OutputStream.

Стас Вишневецкий
источник