0

BufferedReader在 Java 中使用 a 来解析特定的文件格式。

这些文件看起来像这样:

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()and 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()需要一个名为readAheadLimitwhich的参数

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

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

4

1 回答 1

2

创建该类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
    }
}
于 2013-10-01T17:11:59.550 回答