繁体   English   中英

在 Java 中观察文件和目录的变化

[英]Watching for file and directory changes in Java

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

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

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

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

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

提前致谢,对于不那么特定于代码的问题感到抱歉!

这将允许您尝试在 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();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM