我在Java中使用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(???)
}


这是通过标记最后一行的位置来实现的。如果解析器遇到新的标题行,则会将BufferedReader备份到该位置。

但是,mark()采用名为readAheadLimit的参数


  限制仍然可以读取的字符数
  保留商标。读取后尝试重置流
  达到或超过此限制的字符可能会失败。极限值较大
  超过输入缓冲区的大小将导致新的缓冲区被
  分配的大小不小于限制。因此,大价值
  应谨慎使用。


在这种特殊情况下,有什么方法可以提前知道readAheadLimit的大小吗?还是我要计算最大航向的长度并将其用作值?还是应该实施某种行数限制?

最佳答案

创建Scanner类是为了解决此类问题。您重写为使用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
    }
}

09-04 22:26
查看更多