2013-11-02 176 views
1

我正在嘗試開發一種監視服務,每次修改,創建或刪除一段代碼時,都會執行某種操作。監視文件更改Java

我製作了一個守護程序,它實現了WatchService,並獲取了要監視的某個包的路徑,例如「../JDV/src/randompackage/java/test/money_scenario」。

此守護進程具有下面的代碼:

public Daemon(Path dir) throws IOException{ 
    this.dir = dir; 
    watcher = FileSystems.getDefault().newWatchService(); 

    WatchKey key = dir.register(watcher, ENTRY_CREATE,ENTRY_DELETE, 
      ENTRY_MODIFY); 
} 

public void processEvents() throws InitializationError { 
    for (;;) { 
     // wait for key to be signaled 
     WatchKey key; 
     try { 
      key = watcher.take(); 
     } catch (InterruptedException x) { 
      return; 
     } 
     for (WatchEvent<?> event: key.pollEvents()) { 
      WatchEvent.Kind kind = event.kind(); 
      if (kind == OVERFLOW) { 
       continue; 
      } 
      if(kind == ENTRY_CREATE) { 
       System.out.println("Creation has been detected in " + getDirName()); 
      } 
      if(kind == ENTRY_DELETE) { 
       System.out.println("Deletion has been detected in " + getDirName()); 
      } 
      if(kind == ENTRY_MODIFY) { 
       System.out.println("Modification has been detected in " + getDirName()); 
      } 
     } 
     boolean valid = key.reset(); 
     if (!valid) { 
       break; 
     } 
    } 
} 

會發生什麼事是這樣的:我運行守護進程,這是積極的。每當我去創建或刪除money_scenario包中的一個類(它本身有從我可以刪除/創建類的子包)時,守護程序檢測到它並打印「修改已被檢測到」,而不是創建/刪除。當我修改money_scenario包中的類時,它不檢測任何內容。

我在做什麼錯?

編輯:已解決但彈出另一個問題。多個事件: 當我刪除我得到例如一類:

變形具有money_scenario 被檢測缺失已money_scenario被檢測 變形具有money_scenario

回答

2

被檢測到我真的不知道該怎麼告訴你這個,因爲我把你的代碼和它在我的機器上運行得很好。

enter image description here

刪除throws InitializationError,但我懷疑它有什麼用它做的唯一的事情。

配置:Mac OS X的10.9/Java的1.7.0_45/IntelliJ IDEA的12.1.6

附:

其itselves具有從那裏我可以刪除/創建類

WatchService,只是看你指向的目錄,如果你想看你需要遞歸走並註冊每個子目錄子包子樹中的目錄。

編輯:

public void processEvents() { 
    boolean finished = false; 
    while (!finished) { 
     // wait for key to be signaled 
     WatchKey key; 
     try { 
      key = watcher.take(); 
     } catch (InterruptedException x) { 
      return; 
     } 
     for (WatchEvent<?> event : key.pollEvents()) { 
      WatchEvent.Kind<?> kind = event.kind(); 
      switch (kind.name()) { 
       case "ENTRY_CREATE": 
        System.out.println("Creation has been detected in " + getDirName()); 
        break; 
       case "ENTRY_DELETE": 
        System.out.println("Deletion has been detected in " + getDirName()); 
        break; 
       case "ENTRY_MODIFY": 
        System.out.println("Modification has been detected in " + getDirName()); 
        break; 
       default: 
        continue; 
      } 
      if (!key.reset()) { 
       finished = true; 
      } 
     } 
    } 
} 
+0

由於原來如此! 現在我又遇到了另外一個問題,即多個事件被捕獲。 請參閱編輯中的說明。 – Sven

+0

@Sven無法重新創建該錯誤,但您可以嘗試編輯,我認爲它應該不太容易出錯。可能if會多次觸發,因爲創建/刪除操作可能觸發修改事件(取決於操作系統)。 – maryokhin