我正在尝试通过RandomAccessFile进行查找,作为算法的一部分,我必须读取一行,然后从行尾向后查找
E.g
String line = raf.readLine();
raf.seek (raf.getFilePointer() - line.length() + m.start() + m.group().length());
//m is a Matcher for regular expressions我已经收到了大量的off-by-one错误,但我不知道为什么。我刚刚发现这是因为我正在读取的一些文件具有UNIX样式的换行符,\r \n,而另一些文件仅具有windows样式的\n。
有没有一个简单的方法让RandomAccessFile把所有的换行符都当作windows风格的换行符?
发布于 2010-03-24 20:03:30
您可以始终将流向上备份两个字节,然后重新读取它们,以查看它是\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-24 14:24:10
不是的。RandomAccessFile和相关抽象(包括底层文件系统)将文件建模为可索引的字节序列。他们既不知道也不关心线路或线路终端。
您需要做的是记录行开始的实际位置,而不是试图根据关于行终止序列的假设来找出它们在哪里。或者,使用行读取器捕获它读取的每一行的行终止序列,作为该行的一部分,或者在读取每一个输入行之后可以访问的属性中。
或者,在打开文件以进行随机访问之前,将所有文件转换为使用DOS行终止序列。
https://stackoverflow.com/questions/2505658
复制相似问题