WatchService会锁定一些文件吗?

5
我正在使用java.nioWatchService来监视文件系统的变化(用于webapp同步项目)。
然而,当我清理监视的目录时,会遇到一个问题,即某些文件正在使用中(实际上,我是用maven进行清理操作的,maven抱怨无法清理所有内容)。这意味着WatchService以某种方式锁定了被监视的资源。
如何在没有任何锁定/禁止删除的情况下监视目录呢?

我猜这是在Windows上?在Linux或Unix上不应该有问题。 - Robin Green
我也遇到了这个问题,你找到解决方案了吗? - SubJunk
2个回答

1

我长期以来一直使用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;
}

更多信息:FileListener链接

然后,您需要启动该文件侦听器的监视器。这里是一个未经测试的片段,说明如何执行此操作:

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

我希望它有所帮助!

0
如果您想在观察时能够删除条目,您应该将观察者添加到上一级目录中。然后它将锁定该目录,但如果您将其放置在永远不会被删除的目录中,这将不是一个问题。
有时候会出现这样的问题:“如果我想知道树下面的更改怎么办?” 如果您在Windows上使用Sun JRE,可以使用修饰符ExtendedWatchEventModifier.FILE_TREE来监视整个文件树中的所有修改,而不仅仅是立即子节点。我不知道这个修饰符是否支持其他平台。

它不支持任何其他平台。 - sigget
@sigget 我确实说过“如果你在Windows上使用Sun JRE”。 ;) 对于其他人,您可以使用相同的监视器注册每个发现的其他目录,并在它们消失时取消注册。不过很遗憾,即使必须通过艰难的方式完成,它们也不能在所有平台上都给我们树版本。我对JRE正确实现它比对随机开发人员正确实现它更有信心。 - Hakanai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接