在Java中不止一次从BufferedReader读取

时间:2014-01-20 15:11:29

标签: java inputstream bufferedreader urlconnection

我在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...
}

现在我想在文件中搜索其他内容,而不打开其他网址连接

由于与此问题无关的原因,我希望避免在“单个文件扫描”中搜索这两个内容。

问题:

  1. 我可以使用reset回滚文件吗?

  2. 如果是,我应该将其应用于InputStream对象,BufferedReader对象上还是两者上?

  3. 如果不是,那么我应该关闭文件并重新打开吗?

  4. 如果是,我应该将其应用于InputStream对象,BufferedReader对象上还是两者上?

  5. 如果不是,我怎样才能再次扫描文件,而无需再次阅读URL连接?

3 个答案:

答案 0 :(得分:3)

您可以使用reset()快退文件,只要您mark()'编辑了要回放的位置即可。应该在装饰器上调用这些方法,即BufferedReader

但是,您可能希望重新考虑您的设计,因为您可以轻松地将整个文件读入某些数据结构(甚至是字符串列表或某些字符串支持的流)并多次使用该数据。

答案 1 :(得分:1)

使用以下方法:

  • mark
  • skip
  • reset

只有markSupported()返回true时才能执行此操作。请注意,实际上读者通常不会添加此功能,但会将其委托给包装的intput流,因此请始终调用markSupported()并记住它可以为不支持此功能的流返回false。 / p>

例如,基于URL的流确实会发生这种情况:想想,如何重置源自远程服务器的流。这可能需要客户端缓存您已下载的所有内容。

答案 2 :(得分:0)

我通常最终会使用像InputStreamSource之类的东西来重新阅读。当我处理连接时,我发现使用内存或磁盘假脱机策略进行重新读取很有用。使用阈值选择存储位置,在第一次读取时将“tee”插入线轴,并在后续读取时从线轴重新读取。

编辑:还发现guavas ByteSource和CharSource具有相同的目的。