首页 > 解决方案 > 是否保证单个 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

标签: javawatchservice

解决方案


推荐阅读