java scanner转string,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 inputSupplier = new InputSupplier() {

@Override

public InputStream getInput() throws IOException {

return inputStream;

}

};

InputSupplier 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 有很多不同的方法。我们需要做的就是在需要用到的时候选择一个我们方便使用的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值