【问题标题】:Watch for changes to files Java监视对文件 Java 的更改
【发布时间】:2013-11-03 03:36:08
【问题描述】:

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

我已经创建了一个实现 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 中检测到修改

【问题讨论】:

    标签: java watchservice


    【解决方案1】:

    我真的不知道该告诉你什么,因为我拿走了你的代码,它在我的机器上运行良好。

    删除的唯一东西是throws InitializationError,尽管我怀疑它与它有关。

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

    附:

    它本身有子包,我可以从中删除/创建类

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

    【讨论】:

    • 谢谢!现在我遇到了另一个问题,即捕获了多个事件。请参阅编辑中的说明。
    • @Sven 无法重新创建错误,但您可以尝试我的编辑,我认为它应该不太容易出错。可能 if 会触发多次,因为创建/删除可以触发修改事件(取决于操作系统)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多