相当于IOUtils.toString(InputStream)的番石榴
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)
指出:
不关闭
Readable
。
这意味着在此代码完成后,您的InputStreamReader
,以及作为扩展名的InputStream
by
supplier.get()
将不会关闭。
另一方面,如果您利用了似乎已经具有InputSupplier<InputStream>
和使用过重载(CharStreams.toString(InputSupplier<R
extends 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 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);
}
您或多或少需要写些什么才能自己正确处理。
InputSupplier
并且OutputSupplier
在Guava
16.0中已弃用使用它们的方法。其接替者ByteSource
,CharSource
,ByteSink
和CharSink
。给定一个ByteSource
,您现在可以String
像这样获取其内容:
ByteSource source = ...String text = source.asCharSource(Charsets.UTF_8).read();
以上是 相当于IOUtils.toString(InputStream)的番石榴 的全部内容, 来源链接: utcz.com/qa/431581.html