0

我正在尝试通过 RandomAccessFile 进行搜索,作为算法的一部分,我必须读取一行,然后从行尾向后搜索

例如

String line = raf.readLine();
raf.seek (raf.getFilePointer() - line.length() + m.start() + m.group().length());

//m is a Matcher for regular expressions

我一直在收到大量错误,但不知道为什么。我刚刚发现这是因为我正在读取的一些文件具有 UNIX 样式的换行符 \r\n,而有些文件只有 Windows 样式的 \n。

是否容易让 RandomAccessFile 将所有换行符视为 Windows 样式的换行符?

4

2 回答 2

1

不,RandomAccessFile 和相关抽象(包括底层文件系统)将文件建模为可索引的字节序列。他们既不知道也不关心线路或线路终端。

您需要做的是记录线路起点的实际位置,而不是根据线路终止顺序的假设来试图找出它们的位置。或者,使用一个行读取器来捕获它读取的每一行的行终止序列,作为行的一部分或在读取每个输入行后可以访问的属性中。

或者,在打开文件进行随机访问之前,将所有文件转换为使用 DOS 行终止序列。

于 2010-03-24T06:24:10.010 回答
1

您总是可以将流备份两个字节并重新读取它们以查看它是 \r \n 还是 (!\r)\n:

String line = raf.readLine();
raf.seek(raf.getFilePointer()-2);
int offset = raf.read() == '\r' ? 2 : 1;
raf.read(); //discard the second character since you know it is either \n or EOF by definition of readLine
raf.seek (raf.getFilePointer() - (line.length()+offset) + m.start() + m.group().length());

我不确定您要放置文件指针的确切位置,因此请适当调整 2/1 常量。如果文件中出现空行 (\n\n),您可能还需要添加额外的检查,就好像它显示您可能会陷入无限循环而没有代码跳过它一样。

于 2010-03-24T12:03:29.573 回答