2009-10-09 53 views
1

在Windows Vista上使用Java,我試圖爲目錄創建一種監視器,因此每次修改此目錄(新的,重命名,更新或刪除的文件)時都會觸發一個進程。我試圖用一個循環來執行此操作,該循環將在目錄中執行dir並分析所有文件。但是這是非常耗時和耗費內存的,特別是當文件數量開始增長的時候。我認爲應該有更好的方法來做到這一點。如何爲特定目錄創建監視器?

note:這裏有一個similar question,但它是用於C#的。

回答

3

如果您不能等待的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 
} 
+0

您的解決方案看起來比我使用的是目前一個較好。我會嘗試它,而Java 7不在我身邊。 –

+0

你將不得不處理一些可能的異常在我的代碼中拋出。 'Thread.sleep()'和IO操作可以拋出異常。 –

+0

我喜歡TimeUnit.SECONDS.sleep(2)我自己 – Droo

4

我認爲應該有更好的辦法 來做到這一點。

你說得對,應該有更好的方法,它將與Java 7一起發佈。請參閱即將推出的WatchService API

沒有得到一個RC版本,我不知道是否有一種可移植的方式來做你所描述的。

1

你到底在監視什麼?我希望你只需要監視目錄的修改時間,然後檢查目錄修改後文件的修改時間。

因此,我期望存儲一個Map的文件名與修改時間(至少用於檢查)。

不幸的是,沒有easy意味着使用Java來檢查目錄是否存在以某種身份輪詢目錄的更改。請參閱a previous answer of mine wrt。這個問題和庫可以用來簡化這個(加上Java 7功能)

1

您可能需要使用JNI來調用ReadDirectoryChangesW。您可以改爲使用FirstFirstChangeNotification和FindNextChangeNotification,但除非您需要與舊版本(16位)兼容,否則我會建議您不要這樣做。