以Reader形式打开InputStream

4
我可以轻松地使用Guava将InputStream转换为BufferedReader吗?
我正在寻找类似于以下内容的东西:
InputStream inputStream = ...;
BufferedReader br = Streams.newBufferedReader(inputStream);

我可以使用Files.newReader(File file, Charset charset)打开文件。这很酷,我想使用InputStream做同样的事情。

更新:

对我来说,使用CharStreams.newReaderSupplier似乎太冗长了。如果我错了,请纠正我,但是为了轻松地将InputStream转换为BufferedReader,使用Guava,我必须这样做:

final InputStream inputStream = new FileInputStream("/etc/fstab");
Reader bufferedReader = new BufferedReader(CharStreams.newReaderSupplier(new InputSupplier<InputStream>(){
      public InputStream getInput() throws IOException {
        return inputStream;
      }
    }, Charset.defaultCharset()).getInput());

当然,我可以创建一个辅助程序来执行以下操作:

当然,我可以创建辅助程序执行以下操作:

return new BufferedReader(new InputStreamReader(inputStream));

然而,我认为Guava IO应该提供这样的助手程序。我可以为File实例执行此操作。为什么不能为InputStream执行呢?
// Guava can do this
Reader r = Files.newReader(new File("foo"), charset);
// but cannot do this
Reader r = SomeGuavaUtil.newReader(inputStream, charset);

如果我说错了,请纠正我,但是对我来说,似乎API缺失了。


1
我完全同意你的观点,这是非常普遍的事情,如果像Guava这样的通用库能够标准化它,那将是很好的。 - Kees Kist
1个回答

3
不,Guava中没有类似的功能。CharStreams是用于处理Reader和Writer的通用类,并且它有一个方法。
InputSupplier<InputStreamReader> newReaderSupplier(
    InputSupplier<? extends InputStream> in, Charset charset)

这对于任何类型的InputStream供应商都很有用。

显然,你可以只写new BufferedReader(new InputStreamReader(in, charset))或将其包装在自己的工厂方法中。

编辑:

是的,如果你已经有一个InputStream,你不会想使用InputSupplier版本。这有点像制作一个实际上只能工作一次的Iterable,比如包装现有的IteratorEnumeration等。通常,使用InputSupplier需要以稍微不同的方式思考如何进行I/O,例如将File视为可以充当FileInputStream的供应商。我曾经使用过将整个请求封装成InputSupplier来返回响应内容作为InputStream,从而使我能够使用Guava工具将其复制到文件中等。

无论如何,我不完全确定为什么CharStreams没有创建Reader的方法,以从InputStream创建它,除非他们觉得这并不需要。你可能需要提交一个问题请求此功能。


+1 - 显而易见的解决方案是,OP在他的应用程序中添加一个三行辅助方法! - Stephen C
我不会创建自己的辅助方法 - 这就是为什么我使用Guava的原因 :)工厂方法newReaderSupplier对我来说太冗长了。我将在上面的问题中添加解释。 - Henryk Konsek
1
当然,如果Guava已经有了你想要的工具,那是很好的,但我认为,如果没有这样的工具,最好创建自己的工具来完成任务,并在Guava添加此功能后再进行替换。 - ColinD
当然,现在我需要时会使用我的自定义工具。但是我想代表Guava放弃它们。我将联系Google的开发人员并询问他们有没有用于将InputStream转换为BufferedReader的辅助方法。 - Henryk Konsek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接