Преобразование InputStream в OutputStream в Java

Научитесь преобразовывать или передавать InputStream в OutputStream в Java, используя различные API Java, библиотеки Commons-IO и Guava.

Рекомендуется использовать оператор try-with-resources с потоками. В противном случае используйте операторы finally для закрытия потоков.

1. Использование InputStream.transferTo() [Java 9]

Новый метод transferTo() в Java 9 считывает все байты из этого входного потока и записывает байты в заданный выходной поток в том порядке, в котором они считываются.

Он не закрывает ни один из потоков, поэтому важно закрыть потоки другими способами.

try(InputStream inputStream = new ByteArrayInputStream("howtodoinjava".getBytes());OutputStream outputStream = new ByteArrayOutputStream();) {inputStream.transferTo(outputStream);} catch(IOException e) {//handle exception}

2. Написание непосредственно на Java 8

В Java 8 нет API, похожего на transferTo(). Поэтому мы можем имитировать логику, написанную в исходном коде API выше, и написать ее самостоятельно.

void copy(InputStream in, OutputStream out) throws IOException {byte[] buf = new byte[8192];int length;while((length = in.read(buf)) > 0) {out.write(buf, 0, length);}}

3. Использование Guava ByteStreams.copy()

Мы можем использовать API ByteStreams.copy() для передачи байтов из InputStream в OutputStream.

Класс ByteStreams содержит множество служебных методов для работы с массивами байтов и потоками ввода-вывода. Метод copy() копирует все байты из входного потока в выходной поток.

Он не закрывает и не промывает ни один из потоков.

try(InputStream inputStream = new ByteArrayInputStream("howtodoinjava".getBytes());OutputStream outputStream = new ByteArrayOutputStream()) {ByteStreams.copy(inputStream, outputStream);} catch(IOException e) {//handle exception}

4. Использование IOUtils.copy() Commons IO

Класс IOUtils предоставляет статические служебные методы для операций ввода/вывода, включая преобразование между потоками.

Его метод copy() копирует байты из InputStream в OutputStream. Этот метод буферизует ввод внутри, поэтому нет необходимости использовать BufferedInputStream.

try(InputStream inputStream = new ByteArrayInputStream("howtodoinjava".getBytes());OutputStream outputStream = new ByteArrayOutputStream()) {IOUtils.copy(inputStream, outputStream);} catch(IOException e) {//handle exception}

Для больших потоков используйте метод copyLarge(), который поддерживает копирование больших массивов байтов размером более 2 ГБ.

IOUtils.copyLarge(inputStream, outputStream);

4. Заключение

В этом уроке по Java IO мы узнали много простых и удобных способов копирования данных массива байтов из InputStream в OutputStream. Мы научились преобразовывать как маленькие, так и большие входные потоки в выходные потоки.

Исходный код на Github

Прокрутить вверх