我有Stream<String> s = bufferedReader.lines();
bufferedReader返回一个惰性流。
当使用s.skip(100).limit(100)时,它会调用加载内存中的所有内容,否则它将被评估为跳过并限制值。
使用跳过/限制功能的内存占用量是多少?
答案 0 :(得分:2)
为了跳过 100行,将数据读入内存是不可避免的,以便找到行终止符的位置,以便知道要跳过的字符位置。
尽管如此,内存占用量并不依赖于跳过的行数,因为BufferedReader
的内部缓冲区的大小将固定在BufferedReader
的构造上,请参阅{{ 3}}和BufferedReader(Reader)
。
作为极端情况,如果某行不适合缓冲区(请注意默认缓冲区大小为8192
),则该行将使用临时StringBuffer
。
通常,Stream API可以在后端中使用专门的 skip 操作,您可以通过查看BufferedReader(Reader, int)
接口来验证,因此跳过行不会与重复调用readLine()
上的BufferedReader
,但会立即删除生成的字符串。
正如开头所解释的那样,读取数据是不可避免的,因此与读取本身相比,从读取数据创建临时字符串实例的成本可以忽略不计。