1

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

4

3 回答 3

3

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

于 2013-05-29T20:09:34.530 回答
1

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。线的偏移量为2index.get(1)线10index.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
于 2013-05-30T16:18:38.103 回答
0

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

于 2013-06-26T15:45:35.710 回答