微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WatchService被多次触发MODIFY被触发,甚至在CREATE完成之前JAVA

如何解决WatchService被多次触发MODIFY被触发,甚至在CREATE完成之前JAVA

我有一个服务,用于检查文件夹中的ZIP文件

while(true) {
       WatchKey wk = watchService.take();
       for (WatchEvent<?> event : wk.pollEvents()) {

            Kind<?> eventKind = event.kind();

            Path dir = (Path)wk.watchable();
            Path eventPath = (Path) event.context();

            Path fullPath = dir.resolve(eventPath);
            fireAction(eventKind,fullPath);   
        }

        wk.reset();
 }

如果看到的话,每次执行操作时都会调用 fireAction()方法,下面是该方法

public void fireAction(Kind<?> eventKind,Path eventPath) {
        
        synchronized (listeners) {

            if (eventKind == StandardWatchEventKinds.ENTRY_MODIFY) {
                
                fileModified(this,eventPath);
                
            } else if (eventKind == StandardWatchEventKinds.ENTRY_DELETE) {

                fileDeleted(this,eventPath);
                
            } else if (eventKind == StandardWatchEventKinds.ENTRY_CREATE) {

                fileCreated(this,eventPath);
            }
        }
    }

因此,当文件夹为空并且我第一次将ZIP保留在文件夹中时,将调用fileCreate()方法,但未完成,并且fileModify()方法被触发,而fileModify()被触发2次。当我从文件夹中删除ZIP时,它可以正常工作,但是当我再次保留ZIP时,它可以正常工作。

因此只有在第一次出现问题的情况下。请建议,这是我尝试过的

  1. take()和pollEvents()之间的Thread.sleep(3000),位于for循环之外。
  2. 使用.lastModified()来查看文件是否已更新,但是我不确定是否正确执行了操作,还有其他方法吗?请建议

解决方法

为要创建的文件生成校验和,并将校验和存储在值中,并将密钥设置为映射中文件的路径,并在触发修改时,只需验证校验和和文件,

如果校验和存在,请不要修改,否则请修改。

应该易于实现,我也做到了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。