2012-10-08 147 views
1

據我所知,在斯卡拉文件/ URL的迭代器是懶惰的,即斯卡拉 - 懶文件/ URL迭代

scala.io.Source.fromFile("c:/tmp.csv") getLines() 

應該返回一個Iterator[String]還未讀取該文件,並簡單地指向該文件的第一行。但是,如果我調試此代碼,請停在下一行,然後在HDD上實際更改文件,則此迭代器返回的值與更新前的文件相對應。爲什麼會這樣?

這是什麼,我會從一個Java迭代器epect,將預取wholefile到內存

回答

1

顯然,從文件中讀取緩衝(以提高性能,因爲磁盤訪問速度很慢)。所以當你從一個文件開始讀取時,它的一部分被立即讀入緩衝區(例如4kb),所以當你編輯已經讀取的部分時,它在你的程序中不會改變。

我試圖用7Mb文件做到這一點 - 我打開文件,編輯最後一行,編輯正確反映在代碼中。在同行中,當我用4Kb文件做同樣的技巧時,我得到了你描述的行爲。

編輯:我懷疑實際緩衝發生在these lines左右(我喜歡那裏的評論:))。編輯2:其實,我覺得你發現了一些有趣的錯誤 - 因爲我現在正在查看源代碼半小時,而且在getLines的調用之前,我仍然沒有看到緩衝可能發生的位置。