我正在尝试监视一个文件,以了解在Windows或Linux上运行的Java中的更改。
目前,我正在研究轮询文件的最后修改属性,而不是挂钩到操作系统文件事件中,以避免处理平滑 API 差异和处理异步事件。
处理完文件后,我会存储new File("path").lastModified()
的结果,并每 x
秒比较一次新的lastModified
结果。
我是否可以依靠这样一个事实,假设没有犯规并且有人手动修改时间戳,lastModified 将始终增加?Java 文档说它是 GMT 纪元的偏移量,所以大概即使调整时区也不会倒退?
嗯,有时,lastModified
不会增加。这完全与时间分辨率有关,并且每个文件系统中的分辨率都不同:
- 所有
FAT
(FAT32,FAT16,FAT12)都具有2 second
的时间分辨率, - 对于
NTFS
它是100 ns
(是的,纳秒) - 对于大多数*取消其
1 second
.
因此,如果您的文件会快速更改,lastModified
也不会更改,并且您的显示器可能会丢失一些更改。
这也是非常棘手的,因为如果您在不同的文件系统(如 FAT32 和 NTFS)上有相同的文件,它们的lastModified
时间会因时间分辨率不同而有所不同。现在,因为 ot,您可能会对未发生的虚假文件更改做出反应 - 这只是FAT32
返回的时间与NTFS
时间不同 1 秒。Web 服务器也是如此 - 如果您不知道服务器文件系统,那么您就不知道 HTTP 标头中值的时间解析是多少。
解决方法是假设,如果存储值和 FS 值之间的差异小于 3-4 秒,则文件不会更改。这就是WebStart
在服务器上检查新版本的JAR文件时所做的。
文件的时间戳更改为任何内容
http://unixhelp.ed.ac.uk/CGI/man-cgi?touch
如果使用 NTP 之类的东西来校正时间,它可能会倒退。
这些情况很少见,您可能不需要担心。