监视 Java 中的文件和目录更改
Watching for file and directory changes in Java
我在这里写信主要是为了获得有关从哪里开始的建议。我已经实现了一个 class,它将使用 Java 的 WatchService 递归地监视一个目录。它可以很好地检测更改,但我注意到一个致命缺陷:我无法删除正在监视的目录,其中包含正在监视的目录。这似乎是 WatchService 的限制。
我也稍微研究了一下 Apache 的 VFS FileListener,但在我再花 6 个小时左右的时间围绕它构建某种包装器之前,我想也许我应该问问那些知识渊博的人我。
我需要被监视的目录是完全可操作的,除了被监视的根目录不会被删除或重命名。是否已经存在一个好的 class 我可以用来监视不锁定文件或文件夹的文件和目录?我试图避免使用 polling/hash 比较方法,但我越来越觉得我需要使用该方法并消耗大量 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();
}
}
}
我在这里写信主要是为了获得有关从哪里开始的建议。我已经实现了一个 class,它将使用 Java 的 WatchService 递归地监视一个目录。它可以很好地检测更改,但我注意到一个致命缺陷:我无法删除正在监视的目录,其中包含正在监视的目录。这似乎是 WatchService 的限制。
我也稍微研究了一下 Apache 的 VFS FileListener,但在我再花 6 个小时左右的时间围绕它构建某种包装器之前,我想也许我应该问问那些知识渊博的人我。
我需要被监视的目录是完全可操作的,除了被监视的根目录不会被删除或重命名。是否已经存在一个好的 class 我可以用来监视不锁定文件或文件夹的文件和目录?我试图避免使用 polling/hash 比较方法,但我越来越觉得我需要使用该方法并消耗大量 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();
}
}
}