打开InputStream作为Reader

时间:2010-07-03 23:29:15

标签: java io guava

我可以使用Guava轻松地将InputStream转换为BufferedReader吗?

我正在寻找类似的东西:

InputStream inputStream = ...;
BufferedReader br = Streams.newBufferedReader(inputStream);

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

做同样的事情

更新:

使用CharStreams.newReaderSupplier似乎对我来说很冗长。如果我错了,请纠正我,但为了使用Guava轻松将InputStream转换为BufferedReader,我必须做类似的事情:

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 个答案:

答案 0 :(得分:3)

不,在番石榴中没有任何类似的东西。 CharStreams是使用ReaderWriter的常规类,它有一个方法

InputSupplier<InputStreamReader> newReaderSupplier(
    InputSupplier<? extends InputStream> in, Charset charset)

可能适用于任何类型的InputStream s。

供应商

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

修改

是的,当您已经拥有InputSupplier时,您不希望使用InputStream版本。这有点像制作一个实际上只能工作一次的Iterable是一个坏主意,例如包裹现有IteratorEnumeration或其他类似物的InputSupplier。一般来说,使用File需要考虑如何处理I / O有点不同,例如将FileInputStream视为可以充当InputSupplier s供应商的东西。我使用InputStream将整个请求包装到服务器并将响应内容作为CharStreams返回,使我能够使用Guava实用程序将其复制到文件等。

在任何情况下,我都不完全确定为什么Reader没有方法可以从InputStream创建{{1}},除非他们认为不是{{1}}需要。您可能想要提出请求此问题。