你在评论Calum的答案时说你打算使用
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
此代码存在问题,因为重载状态为:CharStreams.toString(Readable)
不关闭 .Readable
这意味着在此代码完成后,您的 和扩展返回的 by 将不会关闭。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
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
和使用它们的方法在Guava 16.0中已被弃用。它们的替换是 、 和 。给定 一个 ,您现在可以像这样获取其内容:OutputSupplier
ByteSource
CharSource
ByteSink
CharSink
ByteSource
String
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();