1

コードの一部が変更、作成、または削除されるたびに特定のアクションを実行する監視サービスを開発しようとしています。

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 で変更が検出されました

4

1 に答える 1

2

私はあなたのコードを取得し、私のマシンで問題なく動作したため、これについて何を伝えればよいか本当にわかりません。

ここに画像の説明を入力

私が削除したのは だけでしたがthrows InitializationError、それと関係があるとは思えません。

構成: Mac OS X 10.9/Java 1.7.0_45/Intellij IDEA 12.1.6

PS

それ自体には、クラスを削除/作成できるサブパッケージがあります

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;
            }
        }
    }
}
于 2013-11-02T10:50:01.217 に答える