使用 NIO 与 RandomAccessFile 读取文件块

Using NIO vs RandomAccessFile to read chunks of files

我想读取一个大约几 GB 的大文本文件并处理它而不是加载整个文件而是加载它的块。(处理涉及计算单词实例)

如果我使用并发哈希映射来并行处理文件以提高效率,有没有办法使用 NIO 或随机访问文件来分块读取文件?它会让它更有效率吗?

当前的实现是使用缓冲的 reader,它是这样的:

while(lines.size() <= numberOfLines && (line = bufferedReader.readLine()) != null) {
     lines.add(line);
}

lines.parallelStream().. // processing logic using ConcurrentHashMap

显而易见的 java 7 解决方案是:

 String lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8).reduce((a,b)->a+b);  

老实说,我不知道它是否更快,但我猜它不会将其读入缓冲区,所以至少理论上它应该更快

RandomAccessFile 仅当您打算 "jump" 在文件中四处走动并且您对正在做的事情的描述听起来不像那样时才有意义。如果您必须处理正在进行的大量并行通信并且您想要执行非阻塞操作,例如 NIO,那么 NIO 是有意义的。在套接字上。这似乎也不是您的用例。

所以我的建议是坚持在 InputStreamReader(FileInputStream) 之上使用 BufferedReader 的简单方法(不要使用 FileReader,因为它不允许您将 charset/encoding 指定为使用)并按照您在示例代码中显示的那样浏览数据。放弃 parallelStream,只有当你发现性能不佳时才可以尝试。

永远记住:过早的优化是万恶之源。