У меня есть столбец BLOB-объектов в моей таблице базы данных, для которого я должен использовать byte[]
в моей Java-программе в качестве отображения, и чтобы использовать эти данные, я должен преобразовать его в InputStream
или OutputStream
. Но я не знаю, что происходит внутри, когда я это делаю. Кто-нибудь может кратко объяснить мне, что происходит, когда я делаю это преобразование?
Вы создаете и используете потоки 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
метод действительно является добычником. Иди рисунок.
Преобразование между InputStream/OutputStream и байтами, с которыми они работают, отсутствует. Они сделаны для двоичных данных, и просто считывают (или записывают) байты один за другим, как есть.
Преобразование должно происходить, когда нужно перейти от байта к графику. Затем нужно преобразовать с помощью набора символов. Это происходит, когда вы делаете String или Reader из байтов, которые сделаны для символьных данных.
Я предполагаю, что вы имеете в виду, что «использование» означает чтение, но то, что я объясню для чтения в случае, может быть в основном обратный для случая записи.
Так что вы в конечном итоге с байтом []. Это может представлять любые данные, которые могут понадобиться специальные типы преобразований (символов, зашифрованные и т. Д.). Давайте притворяться, что вы хотите написать эти данные как файл.
Во-первых, вы можете создать 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();
, если вы используете вышеуказанные фрагменты кода, вам нужно будет обрабатывать исключения, и я рекомендую вам сделать «закрытие» в наконец-то блоке.