java - 观察者在更改后停止

标签 java

如何将下面的 Watcher 转换为持续运行?我希望它即使在检测到更改后也能继续监听文件。也许是一个线程?

import java.io.IOException;
import java.nio.file.*;
import java.util.List;

public class Listener {

    public static void main(String[] args) {

        Path myDir = Paths.get("C:/file_dir/listen_to_this");

        try {
            WatchService watcher = myDir.getFileSystem().newWatchService();
            myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
            WatchKey watckKey = watcher.take();
            List<WatchEvent<?>> events = watckKey.pollEvents();
            for (WatchEvent event : events) {
                if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                    System.out.println("Created: " + event.context().toString());
                }
                if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                    System.out.println("Delete: " + event.context().toString());
                }
                if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                    System.out.println("Modify: " + event.context().toString());
                }
            }
        } catch (IOException | InterruptedException e) {
            System.out.println("Error: " + e.toString());
        }
    }
}

最佳答案

不需要更多线程。您可以简单地将其放入 while 循环中:

public static void main(String[] args) throws Exception {
    Path myDir = Paths.get("C:/file_dir/listen_to_this");

    WatchService watcher = myDir.getFileSystem().newWatchService();
    myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

    while (true) {
        WatchKey watckKey = watcher.take();
        List<WatchEvent<?>> events = watckKey.pollEvents();
        for (WatchEvent event : events) {
            if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                System.out.println("Created: " + event.context().toString());
            }
            if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                System.out.println("Delete: " + event.context().toString());
            }
            if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                System.out.println("Modify: " + event.context().toString());
            }
        }
        watchKey.reset();
    }
}

关于java - 观察者在更改后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11581845/

相关文章:

java - 无法让 REST WS 与 Netbeans 一起工作

java - XStream:如何在编码的 XML 中隐藏 2 个不必要的父节点?

java - 哪里可以下载java包?

java - java中的安全动态sql查询可以更改.createNativeQuery

java - 为什么 compareTo() 有自己的实现体,而 Comparable 是一个接口(interface)?

java - 如何将速度模板中的数据绑定(bind)到 Spring Controller ?

java - FileChannel 和 ByteBuffer 写入额外数据

java - 如何在 Groovy 中经过一定时间后完成或终止进程?

java - 无法实现或扩展 - java

java - 如何隐藏 "java desktop application"