我有Stream<String> s = bufferedReader.lines();
流是否跳過加載內存中的所有內容
該bufferedReader返回一個惰性流。
使用s.skip(100).limit(100)時是否會調用加載內存中的所有內存,否則將被評估爲跳過並限制值。
使用skip/limit函數的內存佔用量是多少?
我有Stream<String> s = bufferedReader.lines();
流是否跳過加載內存中的所有內容
該bufferedReader返回一個惰性流。
使用s.skip(100).limit(100)時是否會調用加載內存中的所有內存,否則將被評估爲跳過並限制值。
使用skip/limit函數的內存佔用量是多少?
爲了跳過100行,將數據讀入內存是不可避免的,以便找到行終止符的位置以知道跳過哪個字符位置。
儘管如此,內存佔用不依賴於被跳過的行的數量,作爲BufferedReader
的大小的內部緩衝將被固定在BufferedReader
的建設,見BufferedReader(Reader)
和BufferedReader(Reader, int)
。
作爲一種特殊情況,如果一行不適合緩衝區(請注意默認緩衝區大小爲8192
),該行將使用臨時StringBuffer
。
一般情況下,存在這樣的流API可以利用的後端,您可以通過查看Spliterator
接口,所以跳過線驗證沒有專門跳過操作對BufferedReader
反覆調用readLine()
沒有什麼不同,但立即丟棄結果字符串。
正如開始所述,讀取數據是不可避免的,因此與讀取本身相比,從讀取數據創建臨時字符串實例的成本可以忽略不計。
流的一點是,它不會保持比它需要更多的狀態。除非您調用[sorted](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted--)這樣的方法,否則Stream將不會跳過內存中的行。限制僅僅是一個計數器,它本身不需要計數以外的任何東西來保留。 – VGR