这篇文章主要是讲怎样将InputStream转换为String。采用[weblink url="http://code.google.com/p/guava-libraries/"]Guava[/weblink]、[weblink url="http://commons.apache.org/proper/commons-io/"]Apache Commons IO [/weblink]以及普通Java代码实现
下面就是一个Guava转换的例子—这里用的是InputSupplier功能:
@Test public void givenUsingGuava_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { String originalString = randomAlphabetic(8); InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); InputSupplier<InputStream> inputSupplier = new InputSupplier<InputStream>() { @Override public InputStream getInput() throws IOException { return inputStream; } }; InputSupplier<InputStreamReader> readerSupplier = CharStreams.newReaderSupplier(inputSupplier, Charsets.UTF_8); String text = CharStreams.toString(readerSupplier); assertThat(text, equalTo(originalString)); }
来按步棸解释下: 1. 首先 — 我们将 InputStream 放入 InputSupplier —这个方法非常简单。 2. 然后 — 我们使用 InputStream 的读取参数—这样我们就可以获得一个字符流。 3. 最后 — 我们使用 Guava 的 CharStreams 工具来转化为String类型。
注意,我们最后使用了 CharStreams.toString 也会我们关闭 inputStream。
下面一个利用 Guava 转化的方法,是没用自动关闭 inputStream 的:
@Test public void givenUsingGuavaAndJava7_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { String originalString = randomAlphabetic(8); InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); String text = null; try (final Reader reader = new InputStreamReader(inputStream)) { text = CharStreams.toString(reader); } assertThat(text, equalTo(originalString)); }
这里 CharStreams.toString 方法是没用自动关闭 inputStream 的— 这就是上面为什么我们使用java7的方法处理的原因。
我们现在来使用用 Apache commons IO 组件来转化 这里要说名一点,相对于 Guava 来说,其他的方法都没有自动关闭 InputStream.
@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)); }
下面一个利用普通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); }
@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)); }
注意,这里关闭 Scanner 的时候 已经关闭 inputStream 了
我们看到,InputStream to String 有很多不同的方法。我们需要做的就是在需要用到的时候选择一个我们方便使用的。