gpt4 book ai didi

java - 在 Java 中监视文件和目录的更改

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:29 25 4
gpt4 key购买 nike

我写这篇文章主要是为了寻求从哪里开始的建议。我已经实现了一个类,它将使用 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();
}
}
}

关于java - 在 Java 中监视文件和目录的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53093136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com