【发布时间】:2017-02-21 19:15:44
【问题描述】:
我正在使用RandomAccessFile 从一个大文件中读取一些信息。
RandomAccessFile 有一个方法 seek 将光标指向我想要读取整行的文件的特定部分。要阅读这一行,我使用readLine() 方法。
我之前阅读了整个文件,然后创建了一个索引,允许我使用seek 方法访问任何行的开头。该索引工作正常。
我根据这个答案创建了这个索引:https://stackoverflow.com/a/42077860/763368
由于我必须在此文件中进行大量访问,因此性能是一个需要注意的重要问题,因此我正在寻找其他选项来读取文件到特定行并获取整行。
我读到FileChannel 和MappedByteBuffer 是快速读取文件的好选择,但我没有看到任何符合我要求的解决方案。
P.S.:线条有不同的长度,我不知道这个长度。
有人有好的解决方案吗?
编辑:
我要读取的文件格式如下:key\tvalue
索引是一个哈希图,该文件的所有键都是键,值是字节位置(Long)。
假设我想用 "foo" 键去一行,那么我必须寻找到值的位置,像这样:
raf.seek(index.get("foo"))
如果我使用raf.readLine(),则返回将是带有 "foo" 键的整行。
但我不想在这项工作中使用RandomAccessFile,因为它太慢了。
这就是我现在在 Scala 中所做的方式:
val raf = new RandomAccessFile(file,"r")
raf.seek(position.get(key))
println(raf.readLine)
raf.close
【问题讨论】:
-
您在访问不同的文件吗?如果不是,为什么要关闭文件访问?如果您保持文件访问打开,则不必等待操作系统授予您读取权限。
-
@Tschallacka 我只是在所有阅读结束时结束,这只是一个例子。但我这里的问题是读取文件的方式。
-
您能否提供索引读取的代码以及如何将其转换为查找位置。因为您已经走上了一条好的道路,您的索引搜索可能会从一些优化中受益,但如果没有完整的代码和示例数据,就很难提供帮助。
-
@Tschallacka 我编辑了我的问题,请看一下。
标签: java nio randomaccessfile filechannel