我正在使用包装在LineNumberReader中的FileReader来索引大文本文件,以便以后快速访问。麻烦的是我似乎找不到直接读取特定行号的方法。 BufferedReader支持skip()函数,但我需要将行号转换为字节偏移量(或者首先索引字节偏移量)。
我使用RandomAccessFile对它进行了破解,虽然它起作用,但在初始索引期间却非常缓慢。 BufferedReader的速度太棒了,但是......好吧,你看到了问题。
一些关键信息:
有什么想法吗?
答案 0 :(得分:2)
答案 1 :(得分:0)
麻烦是我似乎找不到直接读取特定行号的方法
除非您知道每行的长度,否则无法直接阅读
没有快捷方式,您需要预先读取整个文件并手动计算偏移量。
我只使用BufferedReader然后获取每个字符串的长度并为EOL字符串添加1(或2?)。
答案 2 :(得分:0)
考虑将文件索引与大文本文件一起保存。如果您正在生成此文件(无论是在服务器上还是在设备上),那么生成索引一次并将其与文件一起分发和/或保存应该是微不足道的。
我建议使用int [],其中每个值是n *(index + 1)行的绝对偏移量(以字节为单位)。所以你可以有一个大小为35,000的数组,每行的开头,或者一个大小为350的数组,每100行的开头。
这是一个例子,假设你有一个包含int值原始序列的index
文件:
public String getLineByNumber(RandomAccessFile index,
RandomAccessFile data,
int lineNum) {
index.seek(lineNum*4);
data.seek(index.readInt());
return data.readLine();
}
答案 3 :(得分:0)
刚刚结束以前的评论:
您可以使用RandomAccessFile
来计算第一个字节,然后使用第二个解析您读取的内容来手动查找行,或者使用LineNumberReader
来逐行读取行并计算每行char的字节数(手工制作16字节的2个字节?)
答案 4 :(得分:0)
我用它来破解它 RandomAccessFile,虽然它有效, 在这期间,它非常缓慢 初始索引
你已经开始了艰难的部分。现在是更难的部分。
BufferedReader的速度太棒了, 但...
你使用RandomAccessFile有什么东西让它比它变得慢吗?你一次读了几个字节?如果你一次读取一个字节,它将是sloooooow。如果你一次读入一个字节数组,你可以加快速度并将字节数组用作缓冲区。