1. 개요

이 빠른 사용방법(예제)에서는 Java InputStream  을 Java  OutputStream 에 작성하는 방법을 배웁니다 . 먼저 Java 8 및 Java 9의 핵심 기능을 사용할 것입니다. 그런 다음 몇 가지 외부 라이브러리 인 GuavaApache Commons IO 라이브러리를 살펴 보겠습니다 .

Java 9, Guava 및 Apache Commons IO에서 제공하는 유틸리티 메서드는 스트림을 플러시하거나 닫지 않습니다. 따라서 try-with-resources 또는 finally 블록 을 사용하여 이러한 리소스를 관리해야합니다 .

2. Java 8 사용

먼저 바닐라 자바를 사용하여 InputStream  에서  OutputStream으로 콘텐츠를 복사하는 간단한 메서드를 만드는 것으로 시작 합니다 .

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 () 메서드  보다  Files.copy () 를 사용하는 것이 더 효율적 입니다.

4. 구아바 사용

다음으로 Guava의 유틸리티 메서드 ByteStreams.copy ()를 사용  하는 방법을 살펴 보겠습니다 .

우리는 포함해야합니다 구아바 의존성 우리의 pom.xml 파일을 :

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>29.0-jre</version>
</dependency>

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. Commons IO 사용

마지막  으로이 작업에 Commons IO IOUtils.copy () 메서드를 사용하는 방법을 살펴 보겠습니다 .

물론 pom.xml에 commons-io 의존성을 추가해야합니다 .

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

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는 InputStream 및  OutputStream 작업을위한 추가 메서드를 제공합니다  . 2GB 이상의 데이터를 복사해야 할 때마다 IOUtils.copyLarge ()를 사용해야합니다.

6. 결론

이 기사에서는 InputStream  에서  OutputStream으로 데이터복사하는 간단한 방법을 살펴 보았습니다 .

이러한 예제의 구현은 GitHub에서 사용할 수 있습니다 .