代码之家  ›  专栏  ›  技术社区  ›  sdasdadas

如何知道BufferedReader的readAheadLimit?

  •  0
  • sdasdadas  · 技术社区  · 12 年前

    我正在使用 BufferedReader 以解析特定的文件格式。

    这些文件看起来像这样:

    HEADING_ONE
    1
    3
    4.5
    2
    HEADING_TWO
    2
    6
    etc...
    

    因此,我使用以下代码来解析:

    BufferedReader br = new BufferedReader(reader);
    String line = "";
    while ((line = br.readLine()) != null) {
        if (line.startsWith("HEADING_ONE")) {
            while ((line = br.readLine()) != null) {
                // Do something with the line, which is now a number
            }
        else if (line.startsWith("HEADING_TWO")) {
            while... // The same as above
        }
    }
    

    但这段代码有一个问题——内部while循环吃掉了下一行HEADING行。因此,在第一次HEADING解析之后,程序就会崩溃。

    正是出于这个原因,我希望使用 mark() reset() 。我修改了代码,使 内部的 while循环看起来像:

    while ((line = br.readLine()) != null) {
        if (line.contains("HEADING")) {
            br.reset();
            break;
        } else {
            // Do something with the line, which is now a number.
        }
        br.mark(???)
    }
    

    这是通过标记最后一行的位置来实现的。如果解析器遇到新的标题行,它会备份 缓冲区读取 到那个地方。

    然而 标记() 接受一个名为 readAheadLimit 哪个是

    静止时可以读取的字符数限制 保留标记。读取后尝试重置流 达到或超过此限制的字符可能会失败。一个更大的极限值 则输入缓冲区的大小将导致新的缓冲区 分配的大小不小于限制。因此数值较大 应小心使用。

    有没有办法提前知道 读取AheadLimit 在这种特殊情况下?还是计算最大标题的长度并将其用作值?还是应该强制执行某种行限制?

    1 回复  |  直到 12 年前
        1
  •  2
  •   Joni    12 年前

    这个 Scanner 创建类是为了解决这类问题。您的代码被重写为使用扫描仪,看起来如下所示:

    Scanner scanner = new Scanner(reader);
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        if (line.startsWith("HEADING_ONE")) {
            while (scanner.hasNextInt()) {
                int i = scanner.nextInt(); 
                // do something with int
                // skip to next line
                scanner.nextLine();
            }
        } else if (line.startsWith("HEADING_TWO")) {
            while... // The same as above
        }
    }