在Windows Vista上使用Java,我試圖爲目錄創建一種監視器,因此每次修改此目錄(新的,重命名,更新或刪除的文件)時都會觸發一個進程。我試圖用一個循環來執行此操作,該循環將在目錄中執行dir
並分析所有文件。但是這是非常耗時和耗費內存的,特別是當文件數量開始增長的時候。我認爲應該有更好的方法來做到這一點。如何爲特定目錄創建監視器?
note:這裏有一個similar question,但它是用於C#的。
在Windows Vista上使用Java,我試圖爲目錄創建一種監視器,因此每次修改此目錄(新的,重命名,更新或刪除的文件)時都會觸發一個進程。我試圖用一個循環來執行此操作,該循環將在目錄中執行dir
並分析所有文件。但是這是非常耗時和耗費內存的,特別是當文件數量開始增長的時候。我認爲應該有更好的方法來做到這一點。如何爲特定目錄創建監視器?
note:這裏有一個similar question,但它是用於C#的。
如果您不能等待的Java 7和WatchService你必須做這樣的事情:
final File watched = new File("[path of directory to watch]");
long lastModified = watched.lastModified();
while(true) {
if (watched.lastModified() > lastModified) {
// Change happened in the directory do what you want.
}
Thread.sleep(2000); // 2 second interval
}
我認爲應該有更好的辦法 來做到這一點。
你說得對,應該有更好的方法,它將與Java 7一起發佈。請參閱即將推出的WatchService API。
沒有得到一個RC版本,我不知道是否有一種可移植的方式來做你所描述的。
你到底在監視什麼?我希望你只需要監視目錄的修改時間,然後檢查目錄修改後文件的修改時間。
因此,我期望存儲一個Map
的文件名與修改時間(至少用於檢查)。
不幸的是,沒有easy意味着使用Java來檢查目錄是否存在以某種身份輪詢目錄的更改。請參閱a previous answer of mine wrt。這個問題和庫可以用來簡化這個(加上Java 7功能)
您可能需要使用JNI來調用ReadDirectoryChangesW。您可以改爲使用FirstFirstChangeNotification和FindNextChangeNotification,但除非您需要與舊版本(16位)兼容,否則我會建議您不要這樣做。
您的解決方案看起來比我使用的是目前一個較好。我會嘗試它,而Java 7不在我身邊。 –
你將不得不處理一些可能的異常在我的代碼中拋出。 'Thread.sleep()'和IO操作可以拋出異常。 –
我喜歡TimeUnit.SECONDS.sleep(2)我自己 – Droo