据我所知,scala中文件/ url的迭代器是懒惰的,即
scala.io.Source.fromFile("c:/tmp.csv") getLines()
应返回尚未读取该文件的Iterator[String]
,并且只是指向该文件的第一行。但是,如果我调试此代码,停在下一行,去物理上更改HDD上的文件,此迭代器返回的值对应于更新前的文件。为什么会这样?
这是我从Java迭代器中可以看到的,它会将整个文件预取到内存中
答案 0 :(得分:1)
显然,从文件读取是缓冲的(以提高性能,因为磁盘访问速度很慢)。因此,当您从文件开始读取时,它的某些部分会立即被读入缓冲区(例如,4kb),因此当您编辑已读取的部分时,它在您的程序中不会发生变化。
我尝试用7Mb文件执行此操作 - 我打开了文件,编辑了最后一行,编辑正确地反映在代码中。在contary上,当我用4Kb文件做同样的技巧时,我得到了你描述的行为。
编辑:我怀疑实际的缓冲发生在these lines附近(我喜欢那里的评论:))。EDIT2:实际上,我觉得你发现了一些有趣的错误 - 因为我现在正在看源半小时,而且在调用{{{}之前我仍然看不到缓冲可能发生的地方。 1}}。