Java WatchService错过了事件和文件

时间:2018-06-07 11:31:16

标签: java filesystemwatcher watchservice

我想使用Java WatchService API(Windows 7 x64,Java 8)监视特定.csv文件的新创建的子文件夹的文件夹。我希望最终的应用程序是这样的:folders \ files将在其他地方创建并加载到云中(例如GDrive)。从那里我将它们与本地文件夹同步(使用股票软件)。这个本地文件夹我想在它们出现后几分钟内监视和处理文件。同样非常重要的是不要错过任何新文件。

我在这里使用WatchService作为许多教程和问题,但它仍然表现得很奇怪。

  • 当创建文件夹(已经包含文件)时,它既是CREATED又是MODIFIED - 因此文件夹有两个事件。我可以忍受它,但它有时会完全错过它中的文件。 (我想,文件复制得如此之快,甚至在注册和监控这个新文件夹之前它们就在那里)。

  • 当我同时复制多个带文件的文件夹(F1,F2,F3)时,它:
    寄存器F1,检测F1中的修改文件,处理它们,寄存器F2,寄存器F3 同样,无论如何都无法检测到最后两个文件夹中的文件。

这是我使用的简化代码。我正在寻找这个问题的原因以及如何使其更加健壮。 我可以剪切并粘贴每个新文件夹中的所有文件,希望它能检测到它们,但这是最糟糕的解决方案。

更一般的问题 - ws.take()和ws.pollEvents()和ws.reset()之间会发生什么?当事件没有登记时,是否存在盲目时刻?

    public static void main(String args[]) {
    // SET UP LOGGER AND CONFIG VARIABLES HERE

    // CREATE AN OBJECT AND DEFINE AN ABSTRACT startListening()
    WatchServiceClass wsc = new WatchServiceClass() {
       public void startListening(WatchService watchService) {
        while (true) {
            WatchKey queuedKey = watchService.take();
            // DOESNT HELP: Thread.sleep(1000);
            List<WatchEvent<?>> events = queuedKey.pollEvents();
            for (WatchEvent<?> watchEvent : events) {
                if (watchEvent.kind() == StandardWatchEventKinds.OVERFLOW) {
                    continue;
                }
                String action // create, modify or delete 
                String fileName // self explanatory
                String fullPath
                String fullPathParent


                if (action.equals("create")) { // TRACK NEW FOLDERS
                    registerDir(Paths.get(fullPath), watchService);
                }

                if (new File(fullPath).isDirectory()) {
                    continue; // NOT DOING ANYTHING WITH DIRECTORIES
                } 
                // IF HERE, THEN THIS IS THE FILE, DO SOMETHING
                // TAKES SEVERAL MINUTES
            }

            if (!queuedKey.reset()) {
                keyPathMap.remove(queuedKey);
            }
            if (keyPathMap.isEmpty()) {
                break;
            }
        }
    }
    };
     // END OF startListening() METHOD DEFINITION  

    while (true) { // MAIN INFINITE LOOP
      try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
        wsc.registerDir(Paths.get(DATA_DIR), watchService); 
        wsc.startListening(watchService);
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
    }

0 个答案:

没有答案