2016-05-27 61 views
0

我有Stream<String> s = bufferedReader.lines();流是否跳過加載內存中的所有內容

該bufferedReader返回一個惰性流。

使用s.skip(100).limit(100)時是否會調用加載內存中的所有內存,否則將被評估爲跳過並限制值。

使用skip/limit函數的內存佔用量是多少?

+0

流的一點是,它不會保持比它需要更多的狀態。除非您調用[sorted](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted--)這樣的方法,否則Stream將不會跳過內存中的行。限制僅僅是一個計數器,它本身不需要計數以外的任何東西來保留。 – VGR

回答

2

爲了跳過100行,將數據讀入內存是不可避免的,以便找到行終止符的位置以知道跳過哪個字符位置。

儘管如此,內存佔用不依賴於被跳過的行的數量,作爲BufferedReader的大小的內部緩衝將被固定在BufferedReader的建設,見BufferedReader(Reader)BufferedReader(Reader, int)

作爲一種特殊情況,如果一行不適合緩衝區(請注意默認緩衝區大小爲8192),該行將使用臨時StringBuffer

一般情況下,存在這樣的流API可以利用的後端,您可以通過查看Spliterator接口,所以跳過線驗證沒有專門跳過操作對BufferedReader反覆調用readLine()沒有什麼不同,但立即丟棄結果字符串。

正如開始所述,讀取數據是不可避免的,因此與讀取本身相比,從讀取數據創建臨時字符串實例的成本可以忽略不計。

相關問題