Java文件内容变更及内容追加监听方案

简介

对于文件内容变动的监听处理,一般分为两种主要应用场景。

1、只关心文件内容是否发生变更

文件的内容发生变动的场景是全量修改模式,不是内容追加模式。例如某xml文件内容发生变动。这种情况,我们一般只需要监听文件内容是否发生修改,在监听到内容变更后触发业务逻辑对整个文件进行重新加载处理。

2、关心文件新增的内容

这种场景是指文件的内容只会被追加而对文件之前的内容不会产生影响。在文件内容被持续追加时,需要及时获取文件被追加的内容,并将这些内容入库或者进一步处理的场景。例如日志文件这种场景。

Java实现方案

在Java中实现以上两种场景,可以使用 common-io 库来实现,它提供了对文件的监听处理。整体是按观察者模式设计的,共有三部分组成:observer、listener和monitor。

  • 监听器 FileAlterationListener:文件改变时触发的行为。
  • 观察者 FileAlterationObserver:观察文件的改变,通知注册的监听器执行相应的事件。
  • 监视器 FileAlterationMonitor:Monitor本身也是Runnable线程,每间隔一段时间调用一次注册的观察者检查文件,默认时间为10000毫秒,可以通过 new FileAlterationMonitor(long interval) 来自定义时间。

通过以上库我们可以捕获文件、文件夹的创建、修改、删除事件,但是如果我们还想及时获得追加型文件不断追加的内容,就还需要使用到Java自带的 RandomAccessFile 类,它提供的 seek() 方法来访问文件内容,可以从记录的行的位置进行读写操作。这里我们扩展实现这个类,自己记录每次读取到的行数,在文件进行修改时继续读取内容到文件结尾就是文件本次追加的内容(读取到结尾后再记录下行数为下一次读取增量内容做准备)。

本文不包含具体的代码实现,主要是提供实现方法及对应的Java库。具体代码网上有很多,实现的质量虽然参差不齐但也都够用,可以自行整理封装实现。

在主动停止监控时一定要调用 monitor.stop(); 方法,释放线程资源。
对文件/文件夹进行重命名时,会同时触发文件删除和文件创建事件。


(END)

猜你喜欢

转载自blog.csdn.net/catoop/article/details/129951792