java—使用nio vs randomaccessfile读取文件块

ac1kyiln  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(401)

我想读取一个关于几个gbs的大文本文件,并在不加载整个文件的情况下对其进行处理,但要加载其中的大块文件
如果我使用并发哈希Map来并行处理文件以提高效率,有没有一种方法可以使用nio或random access文件来分块读取它?它会使它更有效率吗?
当前的实现是使用一个缓冲读取器,如下所示:

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

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

p3rjfoxz1#

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

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

老实说,我不知道它是否更快,但我在引擎盖下,它不读取到缓冲区,所以至少在理论上它应该更快

kfgdxczn

kfgdxczn2#

RandomAccessFile 只有当你打算在文件中“跳转”并且你对你正在做的事情的描述听起来不是那样的时候才有意义。如果您必须处理大量并行通信,并且希望执行非阻塞操作(例如在套接字上),那么nio是有意义的。这似乎也不是你的用例。
因此,我的建议是坚持在inputstreamreader(fileinputstream)之上使用bufferedreader的简单方法(不要使用filereader,因为这不允许您指定要使用的字符集/编码),并按照示例代码中显示的方式遍历数据。不要使用parallelstream,只有当您看到糟糕的性能时,才可以尝试使用它。
永远记住:过早优化是万恶之源。

相关问题