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