七叶笔记 » java编程 » java.nio.file.WatchService 实时监控文件变化的示例代码

java.nio.file.WatchService 实时监控文件变化的示例代码

在平时的开发过程中,会有很多场景需要实时监听文件的变化,如下:1、通过实时监控 mysql 的 binlog 日志实现数据同步2、修改配置文件后,希望系统可以实时感知3、应用系统将日志写入文件中,日志监控系统可以实时抓取日志,分析日志内容并进行报警4、类似 ide 工具,可以实时感知管理的工程下的文件变更

在 Java 语言中,从 JDK7 开始,新增了java.nio.file.WatchService类,用来实时监控文件的变化。

1.示例代码

FileWatchedService 类:

FileWatchedListener 类:

FileWatchedAdapter 类:

执行以上代码,启动监控任务,然后我在/Users/zhibo/logs/目录中创建、修改、删除文件,命令如下:

应用程序感知到文件变化,打印日志如下:

2.其实并没有实时

大家可以看到,监控任务基本上是以 10 秒为单位进行日志打印的,也就是说修改一个文件,WatchService 10秒之后才能感知到文件的变化,没有想象中的那么实时。根据以上的经验,推测可能是 WatchService 做了定时的操作,时间间隔为 10 秒。通过翻阅源代码发现,在 PollingWatchService 中确实存在一个固定时间间隔的调度器,如下图:

该调度器的时间间隔有 SensitivityWatchEventModifier 进行控制,该类提供了 3 个级别的时间间隔,分别为2秒、10秒、30秒,默认值为 10秒。SensitivityWatchEventModifier 源码如下:

通过改变时间间隔来进行验证,将

修改为:

查看日志,发现正如我们的推断,WatchService 正以每 2 秒的时间间隔感知文件变化。在 stackoverflow 中也有人提出了该问题,问题:Is Java 7 WatchService Slow for Anyone Else,我的 mac 系统中确实存在该问题,由于手头没有 windows、linux 系统,因此无法进行这两个系统的验证。

到此这篇关于java.nio.file.WatchService 实时监控文件变化的文章就介绍到这了,更多相关java.nio.file.WatchService 监控文件变化内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章