2012-10-08 99 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的调用之前,我仍然没有看到缓冲可能发生的位置。