观察文件Java的更改

时间:2013-11-02 10:17:41

标签: java watchservice

我正在尝试开发一种监视服务,每次修改,创建或删除一段代码时,都会执行某项操作。

我已经制作了一个实现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

中检测到修改

1 个答案:

答案 0 :(得分:2)

我真的不确定在这个上告诉你什么,因为我拿了你的代码,它在我的机器上运行良好。

enter image description here

删除的唯一内容是throws InitializationError,但我怀疑它与它有关。

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

P.S。

  

它本身有我可以删除/创建类

的子包

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;
            }
        }
    }
}