【问题标题】:WatchService locks some files?WatchService 锁定了一些文件?
【发布时间】:2014-02-06 07:55:21
【问题描述】:

我正在使用java.nio WatchService 来观察文件系统的变化(对于webapp syncing project)。

但是,当我清理被监视的目录时,我遇到了一个文件正在使用的问题(实际上,我正在使用 maven 进行清理,而 maven 抱怨它无法清理所有内容)。这意味着 WatchService 以某种方式锁定了被监视的资源。

如何在没有任何锁定/禁止删除的情况下查看目录?

【问题讨论】:

  • 我认为这是在 Windows 上?在 Linux 或 Unix 上应该不是问题。
  • 我也遇到过这个问题,你有没有找到解决办法?

标签: java nio


【解决方案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;
}

更多信息:Link to FileListener

然后您需要启动该文件侦听器的监视器。在这里,您有一个未经测试的 sn-p 说明:

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

希望对你有帮助!

【讨论】:

    【解决方案2】:

    如果您希望能够在您仍在观看该条目时删除它,您应该将观察者添加到下一个目录中。然后它会锁定那个目录,但是如果你对一个永远不会被删除的目录进行锁定,这将不是问题。

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

    【讨论】:

    • 其他平台不支持。
    • @sigget 我确实说过“如果您在 Windows 上使用 Sun JRE”。 ;) 对于其他人,您使用同一个观察者注册您发现的所有其他目录,并在它们消失时取消注册它们。可惜他们不能只为我们提供所有平台上的树版本,即使它必须以艰难的方式完成。与随机开发人员正确实现它相比,我对 JRE 正确实现它更有信心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多