首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java RandomAccessFile -处理不同的换行符样式?

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

Stack Overflow用户
提问于 2010-03-24 14:00:59
回答 2查看 2.3K关注 0票数 0

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

E.g

代码语言:javascript
复制
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风格的换行符?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-24 20:03:30

您可以始终将流向上备份两个字节,然后重新读取它们,以查看它是\r \n还是(!\r)\n:

代码语言:javascript
复制
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)出现在您的文件中,您可能还需要添加额外的检查,就好像它显示您可能会陷入无限循环而没有代码跳过它一样。

票数 1
EN

Stack Overflow用户

发布于 2010-03-24 14:24:10

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2505658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档