Рубрики
Без рубрики

Простые способы записи Java InputStream в выходной поток

Узнайте, как написать Java InputStream в Java OutputStream.

Автор оригинала: baeldung.

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 .