4

我可以轻松转换InputStreamBufferedReader使用番石榴吗?

我正在寻找类似的东西:

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

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

更新:

使用CharStreams.newReaderSupplier对我来说似乎很冗长。如果我错了,请纠正我,但为了轻松转换InputStreamBufferedReader使用 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。

4

1 回答 1

3

不,番石榴中没有类似的东西。CharStreams是使用Readers 和Writers 的通用类,它有一个方法

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

这对于任何类型的 s 供应商都可能有用InputStream

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

编辑:

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

无论如何,我不完全确定为什么CharStreams没有一种方法可以ReaderInputStream其他人创建一个,也许他们认为不需要它。您可能需要提交请求此问题的问题。

于 2010-07-04T00:21:39.220 回答