Байт [] для InputStream или OutputStream

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

124
задан bluish 2 September 2011 в 14:23
поделиться

3 ответа

Вы создаете и используете потоки I / O Byte Array следующим образом:

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

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

1 - метод SetBinaryStream метод действительно является добычником. Иди рисунок.

192
ответ дан 24 November 2019 в 01:07
поделиться

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

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

4
ответ дан 24 November 2019 в 01:07
поделиться

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

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

Во-первых, вы можете создать bytearrayinputtream , который в основном является механизмом для подачи байтов на что-то последовательно.

Затем вы можете создать 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();

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

12
ответ дан 24 November 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: