4

我正在尝试监视在 Windows 或 Linux 上运行的 Java 更改的文件。

目前,我正在研究轮询文件的最后修改属性,而不是挂钩 OS 文件事件,以避免处理 API 差异的平滑和处理异步事件。

我正在存储new File("path").lastModified()处理文件并lastModified每秒比较新结果的结果x

我可以相信这样一个事实,假设没有犯规并且有人手动修改时间戳,lastModified 总是会增加吗?Java 文档说它是与 GMT 纪元的偏移量,所以即使调整时区也可能不会倒退?

4

2 回答 2

5

嗯,有时,lastModified不会增加。这完全与时间分辨率有关,并且每个文件系统的分辨率都不同:

  • 所有FATs (FAT32, FAT16, FAT12) 都有2 second时间分辨率,
  • 因为NTFS它是100 ns(是的,纳秒
  • 对于大多数*nixes它的1 second.

因此,如果您的文件会快速lastModified更改,不会更改,并且您的显示器可能会丢失一些更改。

这也很棘手,因为如果您在不同的文件系统(如 FAT32 和 NTFS)上有相同的文件,它们的lastModified时间因时间分辨率不同而不同。现在正因为如此,您可能会对没有发生的虚假文件更改FAT32做出反应 - 它只是返回与时间相差 1 秒的NTFS时间。Web 服务器也是如此——如果你不知道服务器文件系统,那么你就不知道 HTTP Header 中值的时间分辨率是多少。

解决方法是假设如果存储值和 FS 值之间的差异小于 3-4 秒,则文件没有更改。这就是WebStart在服务器上检查 JAR 文件的新版本时所做的事情。

于 2012-06-21T12:33:07.890 回答
1

您可以将文件的时间戳更改为任何内容

http://unixhelp.ed.ac.uk/CGI/man-cgi?touch

如果使用 NTP 之类的方法更正时间,它可以倒退。

这些情况很少见,您可能不需要担心。

于 2012-06-21T13:07:08.550 回答