java - 是否保证单个 WatchService 可以拾取并行复制的所有传入文件?
问题描述
我已经开始使用 WatchService 来监视传入文件的目录。同时复制多个文件时,修改报告可能是交错的,看起来飘忽不定。我的理解是它迟早会接收传入的文件。您是否有证实这一点的支持信息或经验?换句话说,当文件发生修改时,它是否保证能够获取它?
我已经组装了一个简单的应用程序来监视目录的变化。我注意到可能会在较长时间内复制的大文件将被多次拾取以进行修改(StandardWatchEventKinds.ENTRY_MODIFY)。我已经对并行复制的几个文件进行了快速手动测试,我注意到修改报告将是交错的。我将能够检查文件的复制是否完成,因此为同一个文件获取多个报告不是问题。我担心的是在此过程中是否可能会忽略文件。在一个值得关注的场景中,非常小的文件被并行复制到一个非常大的文件中。
private static void start (WatchService watchService) throws Exception {
while (true) {
WatchKey queuedKey = watchService.take();
System.out.println("New key take.");
for (WatchEvent<?> watchEvent : queuedKey.pollEvents()) {
System.out.printf("Event... kind=%s, count=%d, context=%s Context type=%s%n",
watchEvent.kind(),
watchEvent.count(), watchEvent.context(),
((Path) watchEvent.context()).getClass());
if(!queuedKey.reset()){
keyPathMap.remove(queuedKey);
}
if(keyPathMap.isEmpty()){
break;
}
}
}
这是复制时的控制台打印输出
jdevstudio11124install.exe (1.3Gb)
test.txt (4 KB)
新的关键采取。
事件...种类=ENTRY_CREATE,计数=1,上下文=jdevstudio11124install.exe 上下文类型=类 sun.nio.fs.WindowsPath
新的关键采取。
事件...种类=ENTRY_MODIFY,计数=1,上下文=jdevstudio11124install.exe 上下文类型=类 sun.nio.fs.WindowsPath
新的关键采取。
事件... kind=ENTRY_MODIFY, count=1, context=log 上下文类型=class sun.nio.fs.WindowsPath
新的关键采取。
事件... kind=ENTRY_CREATE, count=1, context=test.txt 上下文类型=class sun.nio.fs.WindowsPath
新的关键采取。
事件... kind=ENTRY_MODIFY, count=1, context=test.txt 上下文类型=class sun.nio.fs.WindowsPath
新的关键采取。
事件... kind=ENTRY_MODIFY, count=1, context=test.txt 上下文类型=class sun.nio.fs.WindowsPath
新的关键采取。
事件... kind=ENTRY_MODIFY, count=1, context=log 上下文类型=class sun.nio.fs.WindowsPath
新的关键采取。
事件...种类=ENTRY_MODIFY,计数=1,上下文=jdevstudio11124install.exe 上下文类型=类 sun.nio.fs.WindowsPath
解决方案
推荐阅读
- angular - 如何从角度 2 中的所有打开选项卡中重置 sessionStorage 项目?
- php - 仅当字符串前面带有 PHP 的某个字符时,如何进行字符串替换?
- node.js - 服务器之间通信的安全方式
- java - 将 Java 和 Scala 集成到一个项目中
- java - Spring - 执行两个休眠更新查询而不是一个
- ansible - 在非目标主机名中运行 ansible 命令
- python - 计算数组的非重叠子间隔中的元素数
- google-cloud-firestore - 如何根据 id 请求接收随机文档?限制(10)
- java - iload_1、iload_2、iload_3 和 iload #index 字节码有什么区别?
- c# - 通过 C# 连接到 Informix