我需要处理大文件(几个GB),并且需要快速查找以检索请求的特定行。
我的想法是维护一个映射:
some_key -> byte_location
字节位置表示文件中该行开始的位置。
编辑:问题略有改变:
首先我使用了:
FileInputStream stream = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
FileChannel channel = stream.getChannel();
我注意到
FileChannel.position()
不能返回读取器当前准确位置,因为它是一个“缓冲”的读取器。它按照给定大小的块(这里是16k)读取数据,所以我从FileChannel获取的是16k的倍数,并不是读取器实际读取的准确位置。注:文件采用UTF-8编码。
in.skip(pos);
。或者如何找到所需的位置以跳转并读取整行,而不是部分内容? - khachik