Byte[] to InputStream или OutputStream



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

474   7  

7 ответов:

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

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-The setBinaryStream метод действительно добытчик. Иди разберись.

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

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

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

тогда вы могли бы создать FileOutputStream для файла, который вы хотите создать. существует множество типов входных и выходных потоков для различных источников данных и назначений.

наконец, вы бы записали 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.

мы можем преобразовать массив 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

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

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

output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )

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

byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

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

Comments

    Ничего не найдено.