在Java中多次从BufferedReader读取inputstream
我有以下Java代码:
HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection();
con.connect();
InputStream stream = con.getInputStream();
BufferedReader file = new BufferedReader(new InputStreamReader(stream));
此时,我从头到尾读取文件,同时搜索一些内容:
while (true)
{
String line = file.readLine();
if (line == null)
break;
// Search for something...
}
现在我想在文件中搜索其他内容,而不打开另一个URL连接
出于与此问题无关的原因,我希望避免“在单个文件扫描中”搜索这两种内容
问题:
我可以用
reset
倒带文件吗如果是,我应该在
InputStream
对象、在BufferedReader
对象或两者上应用它吗如果没有,那么我应该关闭文件并重新打开它吗
如果是,我应该在
InputStream
对象、在BufferedReader
对象或两者上应用它吗如果没有,我如何再次扫描文件,而不必再次读取URL连接
# 1 楼答案
使用以下方法:
mark
skip
reset
只有当
markSupported()
返回true
时,才能执行此操作。请注意,实际上reader通常不添加此功能,而是将其委托给包装的输入流,因此请始终调用markSupported()
,并记住,对于不支持此功能的流,它可以返回false
例如,基于URL的流确实可能发生这种情况:想想,如何重置来自远程服务器的流。这可能需要客户端缓存您已经下载的所有内容
# 2 楼答案
我通常会使用类似InputStreamSource的东西来方便重读。当我处理连接时,我发现使用内存或磁盘上的假脱机策略进行重新读取非常有用。使用一个阈值来选择存储位置,在第一次读取时将“T”插入假脱机,然后在后续读取时从假脱机重新读取
编辑:还找到了guavas ByteSource和CharSource,它们有相同的用途
# 3 楼答案
您可以使用
reset()
倒带文件,前提是mark()
已设置了要倒带到的位置。这些方法应该在decorator上调用,即BufferedReader
但是,您可能需要重新考虑您的设计,因为您可以轻松地将整个文件读入某些数据结构(甚至是字符串列表,或字符串支持的某些流),并多次使用数据