Guava equivalent for IOUtils.toString(InputStream)

2022-08-31 09:37:10

Apache Commons IO有一个很好的方便方法IOUtils.toString()来读取一个字符串。InputStream

既然我试图离开Apache Commons并转移到番石榴:在番石榴中有等价物吗?我查看了包中的所有类,找不到任何简单的东西。com.google.common.io

编辑:我理解并欣赏字符集的问题。碰巧我知道我的所有源代码都是ASCII(是的,ASCII,而不是ANSI等),所以在这种情况下,编码对我来说不是问题。


答案 1

你在评论Calum的答案时说你打算使用

CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))

此代码存在问题,因为重载状态为:CharStreams.toString(Readable)

不关闭 .Readable

这意味着在此代码完成后,您的 和扩展返回的 by 将不会关闭。InputStreamReaderInputStreamsupplier.get()

另一方面,如果您利用了您似乎已经拥有并使用重载的事实,则该方法将为您处理 的创建和关闭。InputSupplier<InputStream>CharStreams.toString(InputSupplier<R extends Readable & Closeable>toStringReader

这正是Jon Skeet所建议的,除了实际上没有任何重载需要作为输入......你必须给它一个:CharStreams.newReaderSupplierInputStreamInputSupplier

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);

关键是让你的生活更轻松,让番石榴处理需要丑陋块的零件,以确保资源正确关闭。InputSuppliertry-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中已被弃用。它们的替换是 、 和 。给定 一个 ,您现在可以像这样获取其内容:OutputSupplierByteSourceCharSourceByteSinkCharSinkByteSourceString

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

答案 2

如果你有一个,你可以使用.因此,您可以执行以下操作:ReadableCharStreams.toString(Readable)

String string = CharStreams.toString( new InputStreamReader( inputStream, "UTF-8" ) );

强制您指定一个字符集,我想无论如何您都应该这样做。


推荐