我在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...
}
现在我想在文件中搜索其他内容,而不打开其他网址连接。
由于与此问题无关的原因,我希望避免在“单个文件扫描”中搜索这两个内容。
我可以使用reset
回滚文件吗?
如果是,我应该将其应用于InputStream
对象,BufferedReader
对象上还是两者上?
如果不是,那么我应该关闭文件并重新打开吗?
如果是,我应该将其应用于InputStream
对象,BufferedReader
对象上还是两者上?
如果不是,我怎样才能再次扫描文件,而无需再次阅读URL连接?
答案 0 :(得分:3)
您可以使用reset()
快退文件,只要您mark()
'编辑了要回放的位置即可。应该在装饰器上调用这些方法,即BufferedReader
。
但是,您可能希望重新考虑您的设计,因为您可以轻松地将整个文件读入某些数据结构(甚至是字符串列表或某些字符串支持的流)并多次使用该数据。
答案 1 :(得分:1)
使用以下方法:
mark
skip
reset
只有markSupported()
返回true
时才能执行此操作。请注意,实际上读者通常不会添加此功能,但会将其委托给包装的intput流,因此请始终调用markSupported()
并记住它可以为不支持此功能的流返回false
。 / p>
例如,基于URL的流确实会发生这种情况:想想,如何重置源自远程服务器的流。这可能需要客户端缓存您已下载的所有内容。
答案 2 :(得分:0)
我通常最终会使用像InputStreamSource之类的东西来重新阅读。当我处理连接时,我发现使用内存或磁盘假脱机策略进行重新读取很有用。使用阈值选择存储位置,在第一次读取时将“tee”插入线轴,并在后续读取时从线轴重新读取。
编辑:还发现guavas ByteSource和CharSource具有相同的目的。