我正在尝试使用 RandomAcessFile 搜索一个相当大的文件(5gb)的内容。使用二进制搜索,我将文件分为两部分,但只有当我能够读取 randomacessfile 指针从一开始指向的行时,这种策略才有效。由于不能保证指针将指向文件的开头,我需要一种方法将其定位到它指向的当前行的开头。我参考了 java 文档,但找不到寻找指向文件开头的指针的方法。它确实有一个 readLine() 函数,但它会读取下一行。
3 回答
RandomAccessFile 没有“行”的概念,因为它是字节流读取器/写入器,而不是字符流读取器/写入器。使用 RandomAccessFile,您唯一的选择是向后迭代,直到找到换行符。
2017 年 12 月 4 日星期一 03:46:35 200 459 /挑战/排行榜/视图
2017 年 12 月 4 日星期一 03:46:35 200 460 /挑战/排行榜/视图
文件中有很多行,每行都有相同的格式
<时间> <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
我制作了一个带有函数的程序,该函数将文件指针指向当前行的开头。你可以在这里找到代码。 https://github.com/VihaanVerma89/RandomSolutions/blob/master/interviewStreet/Search/src/logFind.java