Java File Watcher 无法识别文件更改

Posted

技术标签:

【中文标题】Java File Watcher 无法识别文件更改【英文标题】:Java File Watcher doesn't recognize file changes 【发布时间】:2021-01-24 10:51:29 【问题描述】:

我正在尝试使用 Java File Watcher 来侦听文件中的更改。当我使用 vim 编辑文件时,文件观察器会检测到更改。但是当我使用 sed 替换文件中的单词时,文件观察器无法识别这些更改。我可以看到修改日期是对的。

watchService = FileSystems.getDefault().newWatchService();
Path parent = file.getParent();
parent.register(watchService,
                StandartWatchEventKinds.ENTRY_MODIFY
);

sed 命令看起来像这样:

sed -i 's/a/b/g' file.csv

sed 命令本身有效,文件实际上已更改,修改日期也已更改,但由于某种原因,fire watcher 没有

Java版本-openjdk版本1.8.0_222

更新

所以我已经让它工作了, 一开始我尝试了一个 ansible 脚本,我使用了模块“replace”但它没有说话,因此我尝试使用上面提到的 sed 在本地更改文件,但没有成功。

现在我通过制作一个不同的 ansible 脚本让它工作了, 在新脚本中,我使用cp 命令将所需文件复制到 tmp 文件,然后使用 tmp 文件上的“替换”模块,最后将 tmp 文件复制回所需文件。 我不确定为什么会解决它。

我还发现,在我上面描述的过程中使用 ansible 的“复制”模块并没有帮助,只需使用 shell cp 购买它就会触发文件监视程序。

即使我已经解决了,我想知道您是否知道为什么使用 sed 进行更改时文件观察器不触发

【问题讨论】:

文件在什么类型的文件系统上? FileWatcher 不适用于所有类型的文件系统。 操作系统是rhel 7.6,文件系统是xfs 嗯……那可能不是问题所在。我在想一个本地安装的远程文件系统;例如使用 NFS。 您是否在较新的 JDK 上尝试过此测试以查看是否仍然出现? 【参考方案1】:

许多语言都实现了一些“文件观察器”监控功能。它通常归结为使用一些内核功能(例如,Linux 上的inotify)。虽然这在本地文件系统上工作得很好(尽管对被监视的文件数量有一些限制),但它在远程安装的文件系统上经常失败。 This SO answer 是一个很好的解释。

在我们的团队中,我们经常监控数百万个文件的更改/删除/创建,包括在远程位置,但这依赖于轮询(以优化、简约的方式)和缓存。在实现此功能之前,我们尝试并查看了各种语言的其他选项(包括 inotifywatchdog),但意识到它们都无法可靠地检测远程 NFS 上的更改。

一些提示,如果你想开始这样的事情:

    stat 单个目录非常快,但它只检测某些更改(新文件/子目录,删除文件/子目录),而不检测文件/子目录的一些修改; glob 用于约 10K 文件的模式可能比 stat 远程 NFS 上的那些文件快约 50 倍; 通常(但并非总是)上次更改的文件最有可能再次更改:保留这些文件的“尾部”以进行快速检查,但定期进行全面扫描。

【讨论】:

以上是关于Java File Watcher 无法识别文件更改的主要内容,如果未能解决你的问题,请参考以下文章

使用 PyCharmWebStormIDEA 的 File Watcher 插件实时更新文件

webstorm :file types文件类型关联错误 导致文件打开方式不对 修改文件关联设置/文件类型无法正确识别

无法让 IntelliJ 识别 proto 编译的 Java 类文件

File Watcher提供错误代码255 - Syntaxerror

在webstorm设置File watcher for Jade

解决:Failed to run File Watcher ‘goimports‘.The watcher has been disabled.Error: Invalid executable