Научитесь преобразовывать или передавать 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. Мы научились преобразовывать как маленькие, так и большие входные потоки в выходные потоки.