Files.readAllLines和Files.lines方法哪个更快地读取文件?

5

我有一个文件读取器,它将文件的每一行作为Object[]返回。我正在使用lines方法。如果使用readAllLines,会更快吗?我不需要流进行其他操作,但我希望currentBookData是一个String[]Object[]

package input;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class ReadFile {

    public static Object[] currentBookData;

    public static void getBookData(String path) throws IOException {
        try (Stream<String> stream = Files.lines(Paths.get(path), Charset.defaultCharset())) {
            currentBookData = stream.toArray();
        }

        catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

}
2个回答

3
readAllLines() 

将所有内容一次性放入内存中,这样没有比这更快的方法。如果您的文件很大,请不要使用它。


如果我有一个10,000行的文件,那么使用逐行处理是否更好?我认为是的,因为它不会一次性处理所有内容。 - CaffeineToCode
我认为如果你有足够的内存,readAllLines() 每次都会胜出。为什么不尝试使用大文件分别测试两种方法,并使用 System.nanotime() 测量所花费的时间呢? - Sezin Karli
测试完成。结果在我的答案中。奇怪的是,结果显示它花费了约9000秒。虽然这不是真的,但结果可能能够判断更快的方法。println方法是否显示小数? - CaffeineToCode
多大才算“大”? :) - KunLun

-2
对于大文件,lines 实际上更快。结果是使用 nanoTime 方法记录的。以下是结果:

lines: 890453203.00649

readAllLines: 891095615.58289

对于较小的文件,readAllLines 更快。

5
0.0006 秒的差距并不足以成为一个有说服力的基准结果,特别是当涉及到 I/O 时!如果您想要真正对 Java 代码进行基准测试,请使用像 JMH 这样的框架。 - Matt Coubrough
你说得没错,但我运行了多次测试。这些是数据的平均值。每一次,lines 都更快。 - CaffeineToCode
1
很有可能你的“基准测试”大部分时间都在进行JVM热身操作。你的测量结果很可能没有意义。 - Stephen C
你说得对,我现在没有足够的空闲时间进行适当的测试。 - CaffeineToCode
@CaffeineToCode,感谢您的努力。您使用的大文件大小是多少? - Christian Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接