我试图通过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样式的换行?
最佳答案
您总是可以将流备份两个字节,然后重新读取它们,以查看它是\ 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)出现在文件中,您可能还需要添加额外的检查,好像它显示您可能陷入无限循环而没有代码越过它。