Byte [] в InputStream или OutputStream
У меня есть столбец blob в моей таблице базы данных, для которого я должен использовать byte[]
в своей программе Java в качестве сопоставления, и для использования этих данных мне нужно преобразовать его в InputStream
или OutputStream
. Но я не знаю, что происходит внутри, когда я это делаю. Может ли кто-нибудь кратко объяснить мне, что происходит, когда я делаю это преобразование?
Ответы
Ответ 1
Вы создаете и используете потоки ввода-вывода массива байтов следующим образом:
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
действительно является геттером. Наведите указатель мыши.
Ответ 2
Я предполагаю, что вы имеете в виду, что "использование" означает чтение, но то, что я объясню для чтения, может быть в основном отменено для случая записи.
чтобы вы закончили с байтом []. это может представлять собой любые данные, которые могут нуждаться в специальных типах конверсий (характер, зашифрованный и т.д.). пусть притворяется, что вы хотите записать эти данные в виде файла.
во-первых, вы можете создать ByteArrayInputStream, который в основном является механизмом для передачи байтов в чем-то последовательно.
то вы можете создать FileOutputStream для файла, который вы хотите создать. существует множество типов InputStreams и OutputStream для разных источников данных и адресатов.
Наконец, вы должны написать 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.
Ответ 3
Нет никакого преобразования между InputStream/OutputStream и байтами, с которыми они работают. Они созданы для двоичных данных и просто читают (или записывают) байты один за другим, как есть.
Преобразование должно происходить, когда вы хотите перейти от байта к char. Затем вам нужно преобразовать, используя набор символов. Это происходит, когда вы делаете String или Reader из байтов, которые создаются для символьных данных.
Ответ 4
мы можем преобразовать массив 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
Ответ 5
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
Ответ 6
Я действительно понимаю, что мой ответ слишком поздно для этого вопроса, но я думаю, что сообщество будет хотеть более новый подход к этой проблеме.
Ответ 7
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();
Я думаю, что это лучше, поскольку у вас уже есть существующий OutputStream в объекте ответа.
нет необходимости создавать новый OutputStream.