【问题标题】:Watching for file and directory changes in Java在 Java 中监视文件和目录的变化
【发布时间】:2016-06-29 01:36:06
【问题描述】:

我写在这里主要是为了建议从哪里开始。我已经实现了一个类,它将使用 Java 的 WatchService 递归地监视一个目录。它可以很好地检测更改,但我注意到一个致命缺陷:我无法删除包含正在监视的目录的正在监视的目录。这似乎是 WatchService 的限制。

我也对 Apache 的 VFS FileListener 进行了一些研究,但在我花费另外 6 个小时左右的时间围绕它构建某种包装器之前,我想也许我会问那些比我更有知识的人。

我需要被监视的目录是完全可操作的,除了被监视的根目录不会被删除或重命名。是否已经存在一个可以用来监视不锁定文件或文件夹的文件和目录的好类?我试图避免使用轮询/哈希比较方法,但我越来越觉得我需要使用这种方法并消耗大量 CPU 资源。我从哪里开始?理想情况下,我需要:

-检测文件和目录的创建 -检测文件和目录的删除 -检测文件和目录的重命名 - 检测文件的修改 - 检测目录之间的文件移动

我还看到一些人认为观察者不可靠,并且他们使用两者的组合(偶尔轮询以防观察者在某处失败),但是这听起来像一个真正的痛苦,如果它我宁愿避免无论如何都不是最好的方法。我觉得我需要轮询和散列,特别是因为我想检测文件的移动和重命名,但请告诉是否存在更好的选择。

在此先感谢,对于不那么具体的代码问题,我们深表歉意!

【问题讨论】:

  • 谢谢,虽然我已经看到了这个问题。我目前正在尝试使用特定于 Windows 的 FILE_TREE 修饰符来工作,并且取得了一些成功。不过,如果有更好的方法,那就太好了,因为现在我面临着如何检测文件和目录的移动和重命名的奇妙问题。不过,如果我在这方面花费足够长的时间,我最终可能会在课堂上回答我自己的问题。

标签: java file filesystems nio filesystemwatcher


【解决方案1】:

这将允许您尝试在 D:\Temp 下创建、删除、移动和重命名文件,并且应该让您了解您需要的内容:

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Foo3
{
    public static void main(String[] args) throws Exception
    {
        FileSystem fs = FileSystems.getDefault();
        WatchService ws = fs.newWatchService();
        Path pTemp = Paths.get("D:/Temp");
        pTemp.register(ws, new WatchEvent.Kind[] {ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE}, FILE_TREE);
        while(true)
        {
            WatchKey k = ws.take();
            for (WatchEvent<?> e : k.pollEvents())
            {
                Object c = e.context();
                System.out.printf("%s %d %s\n", e.kind(), e.count(), c);
            }
            k.reset();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2023-03-08
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多