您在对 Calum 的回答的评论中声明您将使用
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
此代码有问题,因为重载CharStreams.toString(Readable) 状态:
不关闭Readable。
这意味着您的InputStreamReader 以及supplier.get() 返回的扩展InputStream 在此代码完成后不会关闭。
另一方面,如果您利用了您似乎已经拥有InputSupplier<InputStream> 并使用了重载CharStreams.toString(InputSupplier<R extends Readable & Closeable>),则toString 方法将处理@ 的创建和关闭987654331@给你。
这正是 Jon Skeet 所建议的,除了实际上没有任何将 InputStream 用作输入的 CharStreams.newReaderSupplier 重载...你必须给它一个 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 块以确保正确关闭资源的部分,从而使您的生活更轻松。
编辑:就个人而言,我发现以下内容(我实际上是这样写的,只是分解了上面代码中的步骤)
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();