在Java

时间:2016-06-27 21:19:28

标签: java file filesystems nio filesystemwatcher

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

我也研究过Apache的VFS FileListener,但在我花费6到6个小时的时间构建一些包装器之前,我想我可能只是问一下那些比我更了解的人。

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

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

我也看到一些人认为观察者不可靠,并且他们使用两者的组合(偶尔在观察者失败的地方进行轮询),但是听起来像我真正痛苦的男人如果不是最佳方式,请避免。我有一种感觉,我需要轮询和散列,特别是因为我想检测文件的移动和重命名,但请告诉我们是否存在更好的选项。

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

1 个答案:

答案 0 :(得分:5)

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