Apache Commons IO有一个很好的方便方法IOUtils.toString()将 InputStream
读取到字符串。
因为我正试图从 Apache Commons 转移到 Guava : Guava 有等价物吗?我查看了 com.google.common.io
包中的所有类,但找不到任何简单的东西。
编辑:我理解并理解字符集的问题。碰巧我知道我所有的来源都是 ASCII(是的,ASCII,不是 ANSI 等),所以在这种情况下,编码对我来说不是问题。
最佳答案
您在对 Calum 的回答的评论中声明您将使用
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
这段代码有问题,因为过载 CharStreams.toString(Readable)
状态:
Does not close the
Readable
.
这意味着您的 InputStreamReader
,并通过扩展 InputStream
由 supplier.get()
返回, 代码完成后不会关闭。
另一方面,如果您利用了您似乎已经拥有 InputSupplier<InputStream>
的事实。并使用了过载 CharStreams.toString(InputSupplier<R extends Readable & Closeable>
), toString
方法将处理 Reader
的创建和关闭。给你。
这正是 Jon Skeet 所建议的,除了 CharStreams.newReaderSupplier
实际上没有任何过载这需要 InputStream
作为输入...你必须给它一个 InputSupplier
:
InputSupplier<? extends InputStream> supplier = ...
InputSupplier<InputStreamReader> readerSupplier =
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8);
// InputStream and Reader are both created and closed in this single call
String text = CharStreams.toString(readerSupplier);
InputSupplier
的点是让 Guava 处理需要丑陋的部件,让您的生活更轻松try-finally
block 以确保正确关闭资源。
编辑:就个人而言,我发现以下内容(我实际上是这样写的,只是分解了上面代码中的步骤)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
远比这更简洁:
String text;
InputStreamReader reader = new InputStreamReader(supplier.get(),
Charsets.UTF_8);
boolean threw = true;
try {
text = CharStreams.toString(reader);
threw = false;
}
finally {
Closeables.close(reader, threw);
}
这或多或少是您自己正确处理此问题所必须编写的内容。
编辑:2014 年 2 月
InputSupplier
和 OutputSupplier
并且使用它们的方法在 Guava 16.0 中已被弃用。他们的替代品是ByteSource
, CharSource
, ByteSink
和 CharSink
.给定一个 ByteSource
,您现在可以将其内容作为 String
像这样:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
关于java - IOUtils.toString(InputStream) 的 Guava 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185665/