【问题标题】:Skip a line using BufferedReader (skip, but not read it)使用 BufferedReader 跳过一行(跳过,但不阅读)
【发布时间】:2015-08-27 04:46:02
【问题描述】:

大家好,我目前正在使用BufferedReader 来读取文件。我有类似的东西:

br.readLine() != null

对于每个调用循环。

如果我想跳过一行,现在该怎么办。在这里,我阅读了其他人发布的几个类似问题,其中大多数建议使用readLine()

我知道调用readLine() 一次会导致指针指向下一行。但这不是首选,因为我正在考虑这里的阅读性能。尽管您似乎跳过了一行,但系统实际上已经阅读了它,因此它不是时间效率。我想要的是将指针移动到下一行,而不是读取它。

有什么好主意吗?

【问题讨论】:

  • 另外,对于不使用 BufferedReader 跳过的任何好的建议,我们将不胜感激!和
  • 你不能只用BufferedReader“跳过”一行,它需要读取数据以找到该行的结束位置。
  • 为什么需要跳过一行?除了BufferedReader,您可能还有其他选择
  • @Kayaman:这个问题是合理的。假设您在下一个 '\n' 字符之前还有 10 兆字节。 readLine() 方法会将它们全部读入内存,然后丢弃。
  • 实际上我正在以柱状形式读取多个 csv 文件。问题是我只读取一列,当且仅当该列中的值满足某些条件时,我才需要检索整个记录。否则,我触发指针(在其他文件中)跳过。

标签: java file file-io bufferedreader


【解决方案1】:

如果你关心中间StringBuffer中浪费的内存,可以试试下面的实现:

public static void skipLine(BufferedReader br) throws IOException {
    while(true) {
        int c = br.read();
        if(c == -1 || c == '\n')
            return;
        if(c == '\r') {
            br.mark(1);
            c = br.read();
            if(c != '\n')
                br.reset();
            return;
        }
    }
}

似乎它适用于readLine'\n''\r''\r\n')支持的所有 EOL。

作为替代方案,您可以扩展 BufferedReader 类,将此方法作为实例方法添加到其中。

【讨论】:

    【解决方案2】:

    你读过 readLine() 的代码吗?它逐个读取字符,直到找到 \r 或 \n 并将它们附加到 StringBuffer。您想要的是没有创建 StringBuffer 负担的这种行为。只需重写 BufferedReader 类并提供您自己的实现,该实现只读取字符直到 /r 或 /n 而不构建无用的字符串。

    我看到的唯一问题是很多字段都是私有的......

    【讨论】:

      【解决方案3】:

      一般来说,任何语言和任何 API 都不可能。

      要跳过一行,您需要知道下一行的偏移量。要么你有一个文件格式来为你提供该信息,要么你得到了行偏移作为输入,要么你需要读取每个字节只是为了知道一行何时结束,下一行何时开始。

      【讨论】:

        【解决方案4】:

        不读就不能跳过这一行。

        为了知道跳到哪里,你必须知道下一个换行符在哪里,所以你必须阅读它。

        附:除非您有充分的理由不这样做,否则 BufferedReader 应该适合您 - 它非常有效

        【讨论】:

          猜你喜欢
          • 2014-06-07
          • 1970-01-01
          • 2012-05-02
          • 2013-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-04
          • 1970-01-01
          相关资源
          最近更新 更多