Java InputStream to String 转化

1. 概况

这篇文章主要是讲怎样将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代码实现

2.用Guava转换

下面就是一个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的方法处理的原因。

3. 使用 Apache commons IO 转化

我们现在来使用用 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转化

下面一个利用普通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);
}

5. 使用java的 Scanner

@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 了

6. OVER

我们看到,InputStream to String 有很多不同的方法。我们需要做的就是在需要用到的时候选择一个我们方便使用的。

转载于:https://my.oschina.net/u/265943/blog/292868

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值