如何将文件的行号转换为字节偏移量(或使用BufferedReader获取每行开头的字节偏移量)?

时间:2011-06-17 02:42:13

标签: java android

我正在使用包装在LineNumberReader中的FileReader来索引大文本文件,以便以后快速访问。麻烦的是我似乎找不到直接读取特定行号的方法。 BufferedReader支持skip()函数,但我需要将行号转换为字节偏移量(或者首先索引字节偏移量)。

我使用RandomAccessFile对它进行了破解,虽然它起作用,但在初始索引期间却非常缓慢。 BufferedReader的速度太棒了,但是......好吧,你看到了问题。

一些关键信息:

  • 该文件可以是任何大小(目前为35,000行)
  • 它存储在Android的内部文件系统上(确切地说是通过 getFilesDir()
  • 遗憾的是格式是不是固定宽度(因此需要逐行阅读)

有什么想法吗?

5 个答案:

答案 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。如果你一次读入一个字节数组,你可以加快速度并将字节数组用作缓冲区。