1. Обзор
В этом быстром учебнике, мы научимся писать Java- ВходНая трансляция на Java- ВыходСтрим . Сначала мы будем использовать основные функциональные возможности Java 8 и Java 9. Затем мы посмотрим на пару внешних библиотек – Гуава и Библиотека IO Apache Commons .
Методы утилиты, предоставляемые Java 9, Guava и Apache Commons IO, не смывают и не закрывают потоки. Таким образом, мы должны управлять этими ресурсами с помощью try-with-resources или, наконец, блок.
2. Использование Java 8
Во-первых, мы начнем с создания простого метода с использованием ванильного Java для копирования содержимого из ВходНая трансляция в ВыходСтрим :
void copy(InputStream source, OutputStream target) throws IOException { byte[] buf = new byte[8192]; int length; while ((length = source.read(buf)) > 0) { target.write(buf, 0, length); } }
Этот код довольно прост – мы просто читаем в некоторых байтах, а затем выписать их.
3. Использование Java 9
Java 9 предоставляет утилиту метод, InputStream.transferTo() , для этой задачи .
Давайте посмотрим, как мы будем использовать transferTo () метод:
@Test public void givenUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect() throws IOException { String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream(initialString.getBytes()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream()) { inputStream.transferTo(targetStream); assertEquals(initialString, new String(targetStream.toByteArray())); } }
Обратите внимание, что при работе с потоками файлов более эффективно использовать Файлы.копия () чем transferTo () метод.
4. Использование Гуавы
Далее давайте посмотрим, как мы использовать утилиту гуавы метод ByteStreams.copy () .
com.google.guava guava 29.0-jre
Давайте создадим простой тестовый случай, чтобы показать, как мы могли бы использовать ByteStreams для копирования данных:
@Test public void givenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect() throws IOException { String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream(initialString.getBytes()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream()) { ByteStreams.copy(inputStream, targetStream); assertEquals(initialString, new String(targetStream.toByteArray())); } }
5. Использование Викисклада IO
Наконец, давайте посмотрим, как мы использовать IO- IOUtils.copy () метод для этой задачи.
Конечно, мы должны добавить общий-io зависимости от пом.xml :
commons-io commons-io 2.8.0
Давайте создадим простой тестовый случай, используя IOUtils копирование данных из потока ввода в поток вывода:
@Test public void givenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect() throws IOException { String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream(initialString.getBytes()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream()) { IOUtils.copy(inputStream, targetStream); assertEquals(initialString, new String(targetStream.toByteArray())); } }
Примечание: Commons IO предоставляет дополнительные методы работы с ВходНая трансляция s и ВыходСтрим s. IOUtils.copyLarge () следует использовать всякий раз, когда необходимо скопировать 2 ГБ или более данных.
6. Заключение
В этой статье мы изучили простые способы копирование данных из ВходНая трансляция к ВыходСтрим .
Реализация этих примеров доступна более на GitHub .