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