1. 개요
으로 변환하는 방법을 살펴 봅니다 .
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로 변환
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
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 사용
@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. 결론
는 명확하고 간결한 모범 사례가 필요
하다고 생각합니다 .이러한 모든 예제 및 코드 스 니펫의 구현은 GitHub에서 찾을 수 있습니다.
이것은 Maven 기반 프로젝트이므로 그대로 가져 와서 실행하기 쉬워야합니다.