Байт [] для InputStream или OutputStream - PullRequest
122 голосов
/ 19 января 2010

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

Ответы [ 7 ]

190 голосов
/ 19 января 2010

Вы создаете и используете потоки ввода-вывода массива байтов следующим образом:

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 к BLOB-объектов, используя методы getBinaryStream и setBinaryStream 1 , и вы также можете получить и установить байты напрямую.

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

1 - метод setBinaryStream действительно является геттером. Иди цифрой.

12 голосов
/ 19 января 2010

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

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

во-первых, вы можете создать 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.

6 голосов
/ 02 сентября 2015

мы можем преобразовать массив 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 голосов
/ 19 января 2010

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

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

2 голосов
/ 21 сентября 2016
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
0 голосов
/ 28 января 2015
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

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

0 голосов
/ 02 октября 2013

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

...