繁体   English   中英

在Java中多次从BufferedReader读取

[英]Read from a BufferedReader more than once in Java

我在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连接

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

问题:

  1. 我可以reset后退文件吗?

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

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

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

  5. 如果不是,我又该如何再次清除文件,而无需再次读取URL连接?

您可以使用reset()倒带文件,前提是您已将mark()设置为要倒带的位置。 这些方法应在装饰器(即BufferedReader上调用。

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

使用以下方法:

  • mark
  • skip
  • reset

仅当markSupported()返回true您才可以这样做。 请注意,实际上读者通常不会添加此功能,而是将其委托给包装的输入流,因此请始终调用markSupported()并记住,对于不支持此功能的流,它可能返回false

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM