Java WatchService会锁定一些文件吗?

Java WatchService会锁定一些文件吗?,java,nio,Java,Nio,我正在使用java.nioWatchService监视文件系统的更改(持续一段时间) 然而,当我清理被监视的目录时,我遇到了一个问题,文件正在使用中(事实上,我正在用maven清理,maven抱怨它不能清理所有文件)。这意味着WatchService以某种方式锁定了被监视的资源 如何在不锁定/不允许删除的情况下查看目录?我已经为此目的使用Apache Commons VFS2很长时间了,在任何操作系统中都没有任何问题。基本上,您需要一个类来实现FileListener接口,该接口允许您在目录中添

我正在使用
java.nio
WatchService
监视文件系统的更改(持续一段时间)

然而,当我清理被监视的目录时,我遇到了一个问题,文件正在使用中(事实上,我正在用maven清理,maven抱怨它不能清理所有文件)。这意味着WatchService以某种方式锁定了被监视的资源


如何在不锁定/不允许删除的情况下查看目录?

我已经为此目的使用Apache Commons VFS2很长时间了,在任何操作系统中都没有任何问题。基本上,您需要一个类来实现
FileListener
接口,该接口允许您在目录中添加/更新/删除文件时执行操作:

public interface FileListener {
    /**
     * Called when a file is created.
     */
    void fileCreated(FileChangeEvent event) throws Exception;

    /**
     * Called when a file is deleted.
     */
    void fileDeleted(FileChangeEvent event) throws Exception;

    /**
     * Called when a file is changed.
     */
    void fileChanged(FileChangeEvent event) throws Exception;
}
更多信息:

然后需要启动该文件侦听器的监视器。这里有一个未经测试的代码片段,介绍如何操作:

private void startMonitor() {
    Logger logger = LogManager.getLogger(MyClass.class);
    try {
        FileSystemManager fileSystemManager = VFS.getManager();
        FileObject dirToWatchFO = null;
        String path = "dir/you/want/to/watch";

        File pathFile = new File(path);
        path = pathFile.getAbsolutePath();
        dirToWatchFO = fileSystemManager.resolveFile(path);

        DefaultFileMonitor fileMonitor = new DefaultFileMonitor(new MyFancyFileListener());
        fileMonitor.setRecursive(false);
        fileMonitor.addFile(dirToWatchFO);
        fileMonitor.start();
    } catch (FileSystemException e) {
        logger.error("SOMETHING WENT WRONG!!", e);
    }
}

我希望有帮助

如果您希望能够在仍在观看的情况下删除该条目,则应将观察者添加到上一个目录中。然后它将锁定该目录,但如果您对一个永远不会被删除的目录执行此操作,则不会出现问题


有时,这会引发一个问题:“如果我想知道树下更深层的更改怎么办?”如果您在Windows上使用Sun JRE,您可以使用修饰符
ExtendedWatchEventModifier.FILE_tree
,它将监视文件树中的所有修改,而不仅仅是直接的子项。我不知道其他平台是否支持此修改器。

我假设Windows上支持此修改器?在Linux或Unix上应该不会有问题。我也遇到过这个问题,你有没有找到解决方案?其他平台都不支持它。@sigget我说过“如果你在Windows上使用Sun JRE”。)对于其他人,您向同一观察者注册发现的其他每个目录,并在它们消失时注销它们。可惜的是,他们不能在所有平台上为我们提供树形版本,即使这必须以艰难的方式完成。我对正确实现它的JRE比对正确实现它的随机开发人员更有信心。