我想监控多个文件夹是否有新文件添加到文件夹中。 如果文件添加到文件夹中,我想获取文件的名称。 如何做到这一点。
在 apache commons IO 库中有一个名为 File Monitor 的组件。我想这正是您正在寻找的。
请尝试一下,
for(;;){
System.out.println("START MONITORING **************");
Path faxFolder = Paths.get("E:\\activiti\\monitor\\m1");
Path faxFolder2 = Paths.get("E:\\activiti\\monitor\\m2");
WatchService watchService = FileSystems.getDefault().newWatchService();
faxFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
faxFolder2.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
boolean valid = true;
WatchKey watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent.Kind kind = event.kind();
if (StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind())) {
String fileName = event.context().toString();
System.out.println(fileName);
}
}
}
我比较了 Java WatchService 和 commons-io FileAlterationMonitor 的两种不同方法。
正如本教程中已经写的那样,WatchService 不需要轮询。它可以阻塞线程直到事件可用。 另一方面,FileAlterationMonitor 使用线程进行轮询,并在需要时通知所有已注册的侦听器。
从上面可以得出结论,使用 WatchService 性能更高。然而,性能是特定于实现的。正如文档所述,对于不提供基于事件的通知的平台,可以实施轮询。所以 WatchService 的性能可能会更高。
WatchService 还有另一个警告:它会准确监视您注册的路径。没有递归操作。虽然您现在可以注册创建的所有子目录来监视它们,但 WatchService 发出的 WatchEvent 仅携带相对路径。这样您就不会知道您正在观看的几个目录中的哪一个真正产生了该事件。
commons-io 解决方案并非如此。由于它将更改作为 java.io.File 对象进行通信,因此每个事件都包含完整路径。更重要的是,一旦您查看目录,子文件夹中的更改也会被检测到,而无需额外的努力。
由此决定何时使用可能的内容: