java - IOUtils.toString(InputStream) 的 Guava 等价物

标签 java io inputstream guava

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 ,并通过扩展 InputStreamsupplier.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 月

InputSupplierOutputSupplier并且使用它们的方法在 Guava 16.0 中已被弃用。他们的替代品是ByteSource , CharSource , ByteSinkCharSink .给定一个 ByteSource ,您现在可以将其内容作为 String像这样:

ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();

关于java - IOUtils.toString(InputStream) 的 Guava 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185665/

相关文章:

Java Xuggler 元数据章节列表 MP4/M4V 视频

java - 指向 Java LinkedList 节点的指针

java - 如何在 Spock 中返回 Long 的 stub 方法?

bash - 如何在没有所需库的情况下将由于运行可执行文件而导致的系统错误重定向到文件?

Android AES加密/解密——输入流&字节数组输出流

Java Play 一个请求的两个响应

python-3.x - 如何让dill在python3中加载python2 pickle

java - 无法使用robotium和私有(private)方法在android上截取屏幕截图

java - 无法从 Eclipse 中的单独项目获取 Json 文件

Java 创建新的 ObjectInputStream block