问题描述
我可以使用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楼
不,在番石榴中没有任何类似的东西。
CharStreams
是使用Reader
和Writer
的通用类,它有一个方法
InputSupplier<InputStreamReader> newReaderSupplier(
InputSupplier<? extends InputStream> in, Charset charset)
这可能适用于任何类型的InputStream
供应商。
显然,您可以编写new BufferedReader(new InputStreamReader(in, charset))
或将其包装在您自己的工厂方法中。
编辑:
是的,当您已经拥有InputStream
时,您不希望使用InputSupplier
版本。
这有点像制作一个实际上只能工作一次的Iterable
是一个坏主意,例如包装现有Iterator
或Enumeration
或其他类似的Iterable
。
通常,使用InputSupplier
需要考虑如何使I / O稍微不同,例如将File
视为可以充当FileInputStream
供应商的东西。
我已经使用InputSupplier
将整个请求包装到服务器并将响应内容作为InputStream
返回,使我能够使用Guava实用程序将其复制到文件等。
无论如何,我不完全确定为什么CharStreams
没有从InputStream
创建Reader
的方法,除非他们觉得不需要它。
您可能想要提出请求此问题的问题。