2013-11-02 59 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