Stream是否会加载内存中的所有内容

时间:2016-05-27 07:15:27

标签: java memory bufferedreader java-stream

我有Stream<String> s = bufferedReader.lines();

bufferedReader返回一个惰性流。

当使用s.skip(100).limit(100)时,它会调用加载内存中的所有内容,否则它将被评估为跳过并限制值。

使用跳过/限制功能的内存占用量是多少?

1 个答案:

答案 0 :(得分:2)

为了跳过 100行,将数据读入内存是不可避免的,以便找到行终止符的位置,以便知道要跳过的字符位置。

尽管如此,内存占用量并不依赖于跳过的行数,因为BufferedReader的内部缓冲区的大小将固定在BufferedReader的构造上,请参阅{{ 3}}和BufferedReader(Reader)

作为极端情况,如果某行不适合缓冲区(请注意默认缓冲区大小为8192),则该行将使用临时StringBuffer

通常,Stream API可以在后端中使用专门的 skip 操作,您可以通过查看BufferedReader(Reader, int)接口来验证,因此跳过行不会与重复调用readLine()上的BufferedReader,但会立即删除生成的字符串。

正如开头所解释的那样,读取数据是不可避免的,因此与读取本身相比,从读取数据创建临时字符串实例的成本可以忽略不计。