我正在使用nio.2类的Watch Service API来查看特定目录(Ubuntu 11.10)。无论何时进行更改,例如,如果我在现有文件中进行修改,它将触发MODIFIED事件2次。不知道为什么?我创建新文件时工作正常。
答案 0 :(得分:4)
我找到了解决方案。它会触发两个修改事件,因为当文件系统写入新文件时,它会创建零字节并触发创建事件,然后将数据写入和文件然后触发修改事件。
同样适用于修改。当我们修改现有文件时,文件系统首先使用0字节创建它并触发修改事件然后将数据写入其中。然后它再次触发修改事件。这就是我收到两个修改事件的原因。
答案 1 :(得分:0)
Oracle文档说:“例如,当修改监视目录中的文件时,在某些实现中可能会导致单个ENTRY_MODIFY事件,而在其他实现中则导致多个事件”来源:https://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html
在我的情况下,WatchService在不同的实现(例如,在独立的Java程序和Eclipse中的Web应用程序项目中)和不同的环境(笔记本电脑与服务器)中正确报告了每个文件修改一个ENTRY_MODIFY,但是当我在Tomcat服务器每次对一个文件的修改总是发生两个ENTRY_MODIFY事件。造成这种差异的原因是,尽管我在pom.xml文件中定义了start.class,但我在Maven Web应用程序中有多个Main类,这些类都是在将Web应用程序部署到tomcat服务器上时启动的。
<start-class>com. ... .Application</start-class>
在Eclipse中,只有启动类才启动。 似乎WAR文件中的文件结构与Eclipse Maven项目结构不同导致了这种差异。我的解决方案是删除多余的主类和文件,然后每修改一个文件就只有一个ENTRY_MODIFY。