Java,将RandomAcessFile移动到一行的开头

时间:2013-05-29 20:07:40

标签: java randomaccessfile

我试图使用RandomAcessFile搜索相当大的文件(5gb)的内容。使用二进制搜索我将文件分成两部分,但只有当我能够读取randomacessfile指针从开头指向的行时,这种策略才有效。由于不能保证指针指向文件的开头,我需要一种方法将它定位到它指向的当前行的开头。我引用了java文档,但找不到寻找指向文件开头的指针的方法。它确实有一个readLine()函数,但它会读取下一行。

3 个答案:

答案 0 :(得分:3)

RandomAccessFile没有“行”的概念,因为它是字节流读取器/写入器,而不是字符流读取器/写入器。使用RandomAccessFile,您唯一的选择是向后迭代,直到找到换行符。

答案 1 :(得分:1)

  

Mon Dec 4 03:46:35 2017 200 459 / challenge / leaderboard / view

     

Mon Dec 4 03:46:35 2017 200 460 / challenge / leaderboard / view

     

文件中有许多行都有相同的格式

     

<时间> < resposnetime> <响应代码> < URL>

您的格式不明确,200对我来说就像HTTP 200 OK,因此<response code>,但<URL>之前还有其他紧张......

无论如何......一种方法是索引文件,以便知道每行开始的偏移量。为此,您必须在启动时读取完整文件以构建索引。之后,您可以使用RandomAccessFile及其方法seek(long)轻松浏览这些行。

作为索引,你可以简单地拥有List<Long> index;。第1行的偏移量为index.get(0),应始终为0。第2行的偏移量为index.get(1),行10的偏移量为index.get(9),依此类推。

假设文件中的行已排序,您可以像这样使用二进制搜索

mid = (low+index.size()-1)/2;

// search loop
offset = index.get(mid);
raf.seek(offset);
line = reaf.readLine();
// compare, if not found calc new mid and repeat

答案 2 :(得分:0)

我创建了一个带有函数的程序,该函数将文件指针指向当前行的开头。你可以在这里找到代码。 https://github.com/VihaanVerma89/RandomSolutions/blob/master/interviewStreet/Search/src/logFind.java