java - 在JAVA中使用WatchService。我可以同时观看子目录吗?

标签 java watchservice

在JAVA中,我将使用WatchService来监视目录。

例如,如果我监视/users/monitor,WatchService 只能监视一个目录。

但我想“同时”观看每个子目录

watch /users/monitor
/users/monitor/a
/users/monitor/b
...

我该如何编码? T_T

------------------------代码--------------------------------------------

package testpack;

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

class DirectoryFilter implements FileFilter {
    public boolean accept(File file) {
        return file.isDirectory();
    }
}

public class DirectoryWatchExample {
    public static void testForDirectoryChange(Path myDir) {
        while (true) {
            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 (Exception e) {
                System.out.println("Error: " + e.toString());
            }
        }
    }

    public static void main(String[] args) {
        Path myDir = Paths.get("/users/heejoongkim/monitor");
        // define a folder root
        System.out.println("Monitor Start");
        File dir = new File("/users/heejoongkim/monitor");
        testForDirectoryChange(myDir);
    }
}

------------------------代码--------------------------------------------

最佳答案

您可以将多个目录注册到同一个目录观察程序。取决于子目录的创建方式。如果目录已经存在,您可以使用 File.listFiles 循环并将每个目录注册到同一个观察程序。

如果该文件是在注册观察者后创建的,您可以执行以下操作。

for (WatchEvent<?> event: key.pollEvents()) 
            {
                WatchEvent.Kind<?> kind = event.kind();
                WatchEvent<Path> ev = (WatchEvent<Path>)event;                    
                Path filename = ev.context();
                
                Path child = dir.resolve(filename);
                if(child.toFile().isDirectory() && ev.kind() == ENTRY_CREATE )
                {
                    child.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
                }
                System.out.println(child);
            }

关于java - 在JAVA中使用WatchService。我可以同时观看子目录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26955136/

相关文章:

java - 如何将 JDBC 驱动程序包含在 .war 文件中

双核上的 JAVACL

java - Spring - 用于发送邮件的异步队列

java - 如何使用WatchService观看多个目录?

Java7 : Detect all files when creating a new non-empty directory

java - NamedParameterJdbcTemplate 与 JdbcTemplate

java - 如何在 JSP 文件中不使用 scriplet 的情况下获取应用程序上下文路径?

Java 7 WatchService - 该进程无法访问该文件,因为它正被另一个进程使用

java - 单元测试 WatchService