我正在使用
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
在这种特殊情况下?还是计算最大标题的长度并将其用作值?还是应该强制执行某种行限制?