Java RandomAccessFile - 处理不同的换行样式?

时间:2010-03-24 06:00:59

标签: java newline random-access

我正在尝试通过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

我一直在收到大量的错误,无法弄清楚原因。我刚刚发现它是因为我正在阅读的一些文件具有UNIX风格的换行符,\ r \ n,而有些文件只有windows风格\ n。

RandomAccessFile是否容易将所有换行视为windows风格的换行?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您总是可以将流向上提取两个字节并重新读取它们以查看它是\ r \ n还是(!\ r)\ n 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),就像它出现一样,您可能会陷入无限循环而没有代码跳过它。