3

我正在使用WatchServiceNIO。监视特定目录的两个类(Ubuntu 11.10)。

每当进行更改时,例如,如果我修改现有文件,它就会触发一个MODIFIED事件 2 次。不知道为什么?当我创建新文件时它工作正常。

4

3 回答 3

6

我找到了解决方案。它会触发两个修改事件,因为当文件系统写入新文件时,它会以零字节创建它并触发创建事件,然后将数据写入文件然后触发修改事件。

这同样适用于修改。当我们修改一个已经存在的文件时,文件系统首先用 0 字节创建它并触发一个修改事件,然后将数据写入它。然后它再次触发修改事件。这就是我收到两个修改事件的原因。

于 2012-10-19T10:19:06.433 回答
1

我使用了 Oracle 的示例,奇怪的是有时它会触发ENTRY_MODIFY两次,有时它会触发一次。我正在使用 Windows 机器。

在文档中没有关于可能的重复事件的信息,所以我猜它要么是未记录的行为,要么是错误。

于 2012-09-10T09:01:10.623 回答
1

Oracle 文档说“例如,当监视目录中的文件被修改时,它可能会在某些实现中导致单个 ENTRY_MODIFY 事件,但在其他实现中会导致多个事件”来源:https ://docs.oracle.com/javase /7/docs/api/java/nio/file/WatchService.html

在我的情况下,WatchService 在不同的实现(例如在独立的 Java 程序和 Eclipse 的 Web 应用程序项目中)和不同的环境(笔记本电脑与服务器)中,每个文件修改正确报告了一个 ENTRY_MODIFY,但是当我在 Tomcat 服务器上部署我的 Web 应用程序时每个文件修改总是发生两个 ENTRY_MODIFY 事件。造成这种差异的原因是我的 Maven Web 应用程序中有多个 Main 类,尽管我在 pom.xml 文件中定义了 start.class,但它们都是在 Web 应用程序部署在我的 tomcat 服务器上时启动的:

<start-class>com. ... .Application</start-class>  

在 Eclipse 中,只有 start-class 启动了。与 Eclipse Maven 项目结构相比,WAR 文件中的不同文件结构似乎导致了这种差异。我的解决方案是删除多余的主类和文件,然后每个文件修改只有一个 ENTRY_MODIFY。

于 2019-03-16T11:50:45.557 回答