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