我正在从文本文件中读取连续的字符行.文件中字符的编码可能不是单字节.
在某些时候,我想获得下一行开始的文件位置,这样我可以稍后重新打开文件并快速返回到该位置.
是否有一种简单的方法可以做到这两点,最好是使用标准的Java库?
如果没有,什么是合理的解决方法?
理想的解决方案是处理多种字符编码.这包括UTF-8,其中不同的字符可以用不同的字节数表示.理想的解决方案主要依赖于受信任且支持良好的库.最理想的是标准Java库.第二好的是Apache或Google库.解决方案必须是可扩展的.将整个文件读入内存不是一种解决方案.返回位置不应要求在线性时间内读取所有先前字符.
对于第一个要求,BufferedReader.readLine()是有吸引力的.但缓冲显然会干扰获得有意义的文件位置.
不太明显,InputStreamReader也可以提前读取,干扰获取文件位置.从InputStreamReader文档:
为了能够有效地将字节转换为字符,可以从基础流中提取比满足当前读取操作所需的更多字节.
该方法RandomAccessFile.readLine() 每个字符读取一个字节.
通过取字符的低八位的字节值并将字符的高八位设置为零,将每个字节转换为字符.因此,此方法不支持完整的Unicode字符集.
RandomAccessFile对于随机访问文件非常慢.您经常阅读有关在其上实现缓冲层的信息,但是无法在线查找代码.
所以我的问题是:你们谁知道这个类的任何开源实现共享指针或共享你自己的实现?
如果这个问题会成为关于这个问题的有用链接和代码的集合,我很确定,很多人都会共享这个问题并且SUN从来没有正确解决这个问题.
请不要引用MemoryMapping,因为文件可能比Integer.MAX_VALUE大.