当前位置: 代码迷 >> java >> 打开InputStream作为Reader
  详细解决方案

打开InputStream作为Reader

热度:31   发布时间:2023-07-25 19:14:16.0

我可以使用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。

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

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

这可能适用于任何类型的InputStream供应商。

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

编辑:

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

无论如何,我不完全确定为什么CharStreams没有从InputStream创建Reader的方法,除非他们觉得不需要它。 您可能想要提出请求此问题的问题。

  相关解决方案