您在对Calum答案的评论中表示要使用
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
该代码是有问题的,因为重载
CharStreams.toString(Readable)指出:
不关闭
Readable。
这意味着在此代码完成后,您的
InputStreamReader,以及作为扩展名的
InputStreamby
supplier.get()将不会关闭。
另一方面,如果您利用了似乎已经具有
InputSupplier<InputStream>和使用过重载(
CharStreams.toString(InputSupplier<Rextends Readable & Closeable>)的事实,则该
toString方法将为您处理的创建和关闭
Reader。
这正是乔恩斯基特建议,但没有真正的任何过载
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 callString 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并且
OutputSupplier在Guava
16.0中已弃用使用它们的方法。其接替者
ByteSource,
CharSource,
ByteSink和
CharSink。给定一个
ByteSource,您现在可以
String像这样获取其内容:
ByteSource source = ...String text = source.asCharSource(Charsets.UTF_8).read();



