4

Windows または Linux で実行されている Java でファイルの変更を監視しようとしています。

現在、API の違いをスムーズにして非同期イベントを処理することを避けるために、OS ファイル イベントにフックする代わりに、ファイルの最後に変更されたプロパティをポーリングすることを検討しています。

ファイルを処理した結果を保存し、新しい結果を毎秒new File("path").lastModified()比較しています。lastModifiedx

不正行為がなく、誰かが手動でタイムスタンプを変更したと仮定すると、lastModified は常に増加するという事実を信頼できますか? Java ドキュメントでは、これは GMT エポックからのオフセットであると書かれているため、タイムゾーンを調整しても元に戻らないのではないでしょうか?

4

2 に答える 2

5

まあ、時々、lastModified増加しません。それはすべて時間解像度に関するものであり、解像度はファイルシステムごとに異なります。

  • すべてFATの s (FAT32、FAT16、FAT12) には2 second時間分解能があり、
  • NTFSそれは100 ns(そうです、ナノです)
  • ほとんどの* nixesの場合1 second

そのため、ファイルが急速に変更さlastModifiedれたり、変更されなかったりすると、モニターはいくつかの変更を失う可能性があります。

異なるファイルシステム (FAT32 や NTFS など) に同じファイルがある場合、時間分解能が異なるためlastModified時間異なるため、これも非常に注意が必要です。そのため、発生していない偽のファイル変更に反応している可能性があります。これFAT32は、時刻とは 1 秒異なる時刻を返すだけNTFSです。これは Web サーバーにも当てはまります。サーバーのファイル システムがわからない場合は、HTTP ヘッダーの値の時間分解能がわかりません。

回避策は、保存された値と 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 に答える