有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

问题:

  1. 我可以用reset倒带文件吗

  2. 如果是,我应该在InputStream对象、在BufferedReader对象或两者上应用它吗

  3. 如果没有,那么我应该关闭文件并重新打开它吗

  4. 如果是,我应该在InputStream对象、在BufferedReader对象或两者上应用它吗

  5. 如果没有,我如何再次扫描文件,而不必再次读取URL连接


共 (3) 个答案

  1. # 1 楼答案

    使用以下方法:

    • mark
    • skip
    • reset

    只有当markSupported()返回true时,才能执行此操作。请注意,实际上reader通常不添加此功能,而是将其委托给包装的输入流,因此请始终调用markSupported(),并记住,对于不支持此功能的流,它可以返回false

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

  2. # 2 楼答案

    我通常会使用类似InputStreamSource的东西来方便重读。当我处理连接时,我发现使用内存或磁盘上的假脱机策略进行重新读取非常有用。使用一个阈值来选择存储位置,在第一次读取时将“T”插入假脱机,然后在后续读取时从假脱机重新读取

    编辑:还找到了guavas ByteSource和CharSource,它们有相同的用途

  3. # 3 楼答案

    您可以使用reset()倒带文件,前提是mark()已设置了要倒带到的位置。这些方法应该在decorator上调用,即BufferedReader

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