apache commons-io首先需要添加对应依赖:
<dependency> <groupid>commons-io</groupid> <artifactid>commons-io</artifactid> <version>2.7</version></dependency>
版本可自行选择,这里需要注意的是 2.7 版本及以上需要 java 8
官网截图:
apache commos io中的 org.apache.commons.io.monitor包提供了文件系统监听的功能。
核心知识一句话总结:通过观察者模式以及事件监听机制,以 filealterationobserver 为核心,再通过 filealterationlistener,filealterationmonitor,就可以实现对文件系统的事件监听。
整体流程:
自定义文件监听类并继承 filealterationlisteneradaptor 实现对文件与目录的创建,修改,删除事件的处理
自定义文件监控类,通过指定目录创建一个观察者 filealterationobserver
向此监视器添加文件系统观察器,并添加文件监听器
通过 applicationrunner 或者 commandlinerunner 调用并执行
代码实现文件监听类:
/** * 文件监听类 * @author greenarrow * @date 2022-05-12 14:43 **/public class filelistener extends filealterationlisteneradaptor { private static logger logger = loggerfactory.getlogger(filelistener.class); @override public void onstart(filealterationobserver observer) { super.onstart(observer); logger.info("onstart"); } @override public void ondirectorycreate(file directory) { logger.info("[新建]:" + directory.getabsolutepath()); } @override public void ondirectorychange(file directory) { logger.info("[修改]:" + directory.getabsolutepath()); } @override public void ondirectorydelete(file directory) { logger.info("[删除]:" + directory.getabsolutepath()); } @override public void onfilecreate(file file) { string compressedpath = file.getabsolutepath(); logger.info("[新建]:" + compressedpath); list<string> contentlist = null; try { if (file.canread()){ // 将文件按行读取为字符串集合 contentlist = fileutils.readlines(new file(compressedpath), standardcharsets.utf_8); if (collectionutil.isnotempty(contentlist)){ // 获取对应格式的数据并输出,这里可自行添加业务处理 list<string> dirtyrecord = contentlist.stream().filter(s -> s.startswith("{") && s.endswith("}")).collect(collectors.tolist()); dirtyrecord.foreach(system.out::println); } } } catch (ioexception e) { e.printstacktrace(); logger.error("读取文件内容失败",e); } } @override public void onfilechange(file file) { string compressedpath = file.getabsolutepath(); logger.info("[修改]:" + compressedpath); } @override public void onfiledelete(file file) { logger.info("[删除]:" + file.getabsolutepath()); } @override public void onstop(filealterationobserver observer) { super.onstop(observer); logger.info("onstop"); }}
文件监控类:
/** * 文件监听测试 demo * @author greenarrow * @date 2022-05-12 14:45 **/public class filemonitor { filealterationmonitor monitor = null; public filemonitor(long interval) throws exception { monitor = new filealterationmonitor(interval); } /** * 给文件添加监听 * @param path * @param listener */ public void monitor(string path, filealterationlistener listener) { filealterationobserver observer = new filealterationobserver(new file(path)); monitor.addobserver(observer); observer.addlistener(listener); } public void stop() throws exception { monitor.stop(); } public void start() throws exception { monitor.start(); }}
自定义 runner 并实现 commandlinerunner :
/** * 项目启动之后开启文件监听功能 * @author greenarrow * @date 2022-05-12 10:02 **/@component// @order(integer.min_value)public class dirtyrecordrunner implements commandlinerunner { private static logger logger = loggerfactory.getlogger(dirtyrecordrunner.class); @value("${test}") private string path; @override public void run(string... args) throws exception { logger.info(this.getclass().getname()+"[开启文件夹监听功能]"); filemonitor filemonitor = new filemonitor(1000); filemonitor.monitor(path,new filelistener()); filemonitor.start(); }}
以上就是java如何实现日志文件监听并读取相关数据的详细内容。
