1. 개요

 
이 튜토리얼에서는 Guava , Apache Commons IO 라이브러리 및 일반 Java를 사용하여 InputStream 을 String

으로 변환하는 방법을 살펴 봅니다 .

2. 구아바로 변환

ByteSource

기능을 활용하는 Guava 예제부터 시작하겠습니다 .
@Test
public void givenUsingGuava_whenConvertingAnInputStreamToAString_thenCorrect() 
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    ByteSource byteSource = new ByteSource() {
        @Override
        public InputStream openStream() throws IOException {
            return inputStream;
        }
    };

    String text = byteSource.asCharSource(Charsets.UTF_8).read();

    assertThat(text, equalTo(originalString));
}
단계를 살펴 보겠습니다.
  • 첫째 - 우리는 우리의 포장 의 InputStream ByteSource을 - 그리고 지금까지 내가 알고 있어요,이 그렇게 할 수있는 가장 쉬운 방법입니다
  • 그런 다음 -ByteSource 를 UTF8 문자 집합 이있는 CharSource봅니다 .
  • 마지막으로 CharSource사용하여 문자열 로 읽습니다.

Guava로 변환

하는 더 간단한 방법 이지만 스트림을 명시 적으로 닫아야합니다. 다행히도 try-with-resources 구문을 사용하여이를 처리 할 수 ​​있습니다.
@Test
public void givenUsingGuavaAndJava7_whenConvertingAnInputStreamToAString_thenCorrect() 
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());
 
    String text = null;
    try (Reader reader = new InputStreamReader(inputStream)) {
        text = CharStreams.toString(reader);
    }
 
    assertThat(text, equalTo(originalString));
}

3. Apache Commons IO로 변환

 
이제 Commons IO 라이브러리를 사용하여이를 수행하는 방법을 살펴 보겠습니다.여기서 중요한주의 사항은 Guava와 달리이 예제 중 어느 것도

InputStream

을 닫을 수 없다는 것 입니다. 이것이 제가 개인적으로 Guava 솔루션을 선호하는 이유입니다.
@Test
public void givenUsingCommonsIo_whenConvertingAnInputStreamToAString_thenCorrect() 
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    String text = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
    assertThat(text, equalTo(originalString));
}

StringWriter

사용 하여 변환 할 수도 있습니다 .
@Test
public void givenUsingCommonsIoWithCopy_whenConvertingAnInputStreamToAString_thenCorrect() 
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    StringWriter writer = new StringWriter();
    String encoding = StandardCharsets.UTF_8.name();
    IOUtils.copy(inputStream, writer, encoding);

    assertThat(writer.toString(), equalTo(originalString));
}

4. Java로 변환 – InputStream

 
이제 일반 Java (

InputStream

및 간단한

StringBuilder)를

사용하는 더 낮은 수준의 접근 방식을 살펴 보겠습니다 .
@Test
public void givenUsingJava5_whenConvertingAnInputStreamToAString_thenCorrect() 
  throws IOException {
    String originalString = randomAlphabetic(DEFAULT_SIZE);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    StringBuilder textBuilder = new StringBuilder();
    try (Reader reader = new BufferedReader(new InputStreamReader
      (inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
        int c = 0;
        while ((c = reader.read()) != -1) {
            textBuilder.append((char) c);
        }
    }
    assertEquals(textBuilder.toString(), originalString);
}

4.1. Java 8 사용

 
Java 8은 BufferedReader에 새로운

lines ()

메서드를 제공합니다 . InputStreamString 으로 변환하는 데 어떻게 사용할 수 있는지 살펴 보겠습니다 .
@Test
public void givenUsingJava8_whenConvertingAnInputStreamToAString_thenCorrect() {
    String originalString = randomAlphabetic(DEFAULT_SIZE);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    String text = new BufferedReader(
      new InputStreamReader(inputStream, StandardCharsets.UTF_8)))
        .lines()
        .collect(Collectors.joining("\n"));

    assertThat(text, equalTo(originalString));
}

lines ()

내부적으로

readLine ()

메서드를 사용 한다는 점을 언급하는 것이 중요합니다 .

readLine ()

은 줄 바꿈 ( "\ n"), 캐리지 리턴 ( "\ r") 또는 바로 뒤에 줄 바꿈이 오는 캐리지 리턴 중 하나로 줄이 종료된다고 가정합니다. 즉, Unix, Windows 및 이전 Mac OS와 같은 모든 일반적인

End Of Line

스타일을 지원합니다 .다른 한편으로,

우리가 사용하는 경우 Collectors.joining을 () , 우리는 명시 적으로 우리가 만들어에 사용할 EOL의 유형을 결정해야합니다 문자열

.

Collectors.joining (System.lineSeparator ())를

사용할 수도 있습니다. 이 경우 출력은 시스템 설정에 따라 다릅니다.

5. Java 및 스캐너로 변환

 
다음 – 표준 텍스트

스캐너를

사용하는 일반 Java 예제를 살펴 보겠습니다 .
@Test
public void givenUsingJava7_whenConvertingAnInputStreamToAString_thenCorrect() 
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    String text = null;
    try (Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name())) {
        text = scanner.useDelimiter("\\A").next();
    }

    assertThat(text, equalTo(originalString));
}
참고는 것을

의 InputStream이

의 폐쇄에 의해 폐쇄 될 예정이다

스캐너

.

useDelimiter ( "\\ A")의 기능을

명확히하는 것도 가치 가 있습니다. 여기에서 입력의 시작을 나타내는 경계 마커 정규식 인 '\ A'를 전달했습니다. 본질적으로 이것은

next ()

호출이 전체 입력 스트림을 읽는다는 것을 의미 합니다.이것이 Java 7 예제이고 Java 5 예제가 아닌 유일한 이유는

try-with-resources

문을 사용하기 때문입니다. 이를 표준

try-finally

블록으로

바꾸면 Java 5에서 잘 컴파일됩니다

.

6. ByteArrayOutputStream을 사용하여 변환

 
마지막으로, 이번에는

ByteArrayOutputStream

클래스를 사용하는 또 다른 일반 Java 예제를 살펴 보겠습니다 .
@Test
public void givenUsingPlainJava_whenConvertingAnInputStreamToString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int nRead;
    byte[] data = new byte[1024];
    while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, nRead);
    }

    buffer.flush();
    byte[] byteArray = buffer.toByteArray();
        
    String text = new String(byteArray, StandardCharsets.UTF_8);
    assertThat(text, equalTo(originalString));
}
이 예제에서 먼저

InputStream

바이트 블록을 읽고 쓰는 방식 으로

ByteArrayOutputStream

으로 변환 된 다음

OutputStream

String

을 만드는 데 사용되는 바이트 배열로 변환됩니다 .

7. java.nio로 변환

 
또 다른 해결책은

InputStream

의 내용을 파일 에 복사 한 다음이를 String으로 변환하는 것입니다

.

@Test
public void givenUsingTempFile_whenConvertingAnInputStreamToAString_thenCorrect() 
  throws IOException {
    String originalString = randomAlphabetic(DEFAULT_SIZE);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    Path tempFile = 
      Files.createTempDirectory("").resolve(UUID.randomUUID().toString() + ".tmp");
    Files.copy(inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING);
    String result = new String(Files.readAllBytes(tempFile));

    assertThat(result, equalTo(originalString));
}
여기서는

java.nio.file.Files

클래스를 사용하여 임시 파일을 만들고

InputStream

의 내용을 파일에 복사 합니다. 그런 다음 동일한 클래스를 사용 하여 readAllBytes () 메서드를 사용하여 파일 내용을

문자열

로 변환합니다 .

8. 결론

 
정확하고 읽기 쉬운 방식으로 간단한 변환을 수행하는 가장 좋은 방법 인 InputStream을 String으로 컴파일 한 후 매우 다양한 답변과 솔루션을 확인한 후에

는 명확하고 간결한 모범 사례가 필요

하다고 생각합니다 .이러한 모든 예제 및 코드 스 니펫의 구현은 GitHub

에서 찾을 수 있습니다.

이것은 Maven 기반 프로젝트이므로 그대로 가져 와서 실행하기 쉬워야합니다.