Files.lines是否会将所有行读入内存?

12

文档中说:

将文件的所有行作为Stream读取。

这是否意味着它正在加载整个文件?例如:

try (Stream<String> stream = Files.lines(Paths.get("myfilename.txt"))) {
        stream.forEach(x -> {

如果myfilename的大小为100GB,那么Files.lines会加载整个100GB吗?

Translated text:

如果myfilename的大小为100GB,那么Files.lines会加载整个100GB吗?


2
这个问题本身很好,但它缺乏研究的努力。该方法的文档清楚地解释了该方法是懒加载的。所以如果你想将流限制为100个元素,它只会读取100行。公正起见,您需要遵循该方法到更一般的版本,以找到该注意事项。 - Zabuzard
4个回答

9
好的,您提供的链接已经说明了它:
readAllLines 不同的是,该方法不会将所有行读入列表中,而是在流被消耗时进行惰性填充。
因此,每次调用您的for-each块时,都会读取一行新数据。

6
不,它并不会将整个文件加载到内存中。它在内部使用一个具有默认缓冲区大小的BufferedReader,反复调用readLine()

2
自1.8版本起,新增了一种名为lines()的方法,它使得BufferedReader可以将内容返回为一个Stream流。该方法并不会将所有行都读取到一个List中,而是在流被消费时才会惰性地填充。当您调用for-each时,会重新加载新行。希望能对您有所帮助!

0

如果使用并行流和Files.lines,Spliterator会出现问题。所有处理过的行都将存储在Spliterator中,这使得它对于大文件不可用。


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