使用commons-io-2.0 API来实现监听文件变化_左边的天堂的博客-程序员ITS304

技术标签: JAVA  文件监听  commons-io2  

监听文件变化的实现有很多种,之前使用的是commons-VFS的api,使用起来有一些不是很方便,后来摸索了下,发现commons-io-2.0 也可以实现文件的监听。

今天就来介绍一下它的用法。

首先,继承FileAlterationListenerAdaptor 实现它的功能:

import java.io.File;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileListerAdapter extends FileAlterationListenerAdaptor {
	private static final Logger logger = LoggerFactory.getLogger(FileListerAdapter.class);	
	
	@Override
	public void onFileChange(File file) {
		if (!file.exists() || !file.canRead()) {
			logger.info("The file {} is not exists or is not readable!", file);
			return;
		}
		logger.info("----The file {} is change.", file);
		//TODO 读取操作
		super.onFileChange(file);
	}

	@Override
	public void onFileCreate(File file) {
		if (!file.exists()) {
			logger.info("The file {} is not exists!", file);
			return;
		}
		if (!file.canRead()) {
			logger.info("The file {} is not readable!", file);
			return;
		}
		logger.info("----The file {} is created.", file);
		//TODO 读取操作
		super.onFileCreate(file);
	}

	@Override
	public void onFileDelete(File file) {
		logger.info("----The file {} is deleted.", file);
		super.onFileDelete(file);
	}

	@Override
	public void onDirectoryChange(File directory) {
		if (!directory.exists()) {
			logger.info("The directory {} is not exists!", directory);
			return;
		}
		logger.info("----The directory {} has changed.", directory);
		super.onDirectoryChange(directory);
	}

	@Override
	public void onDirectoryCreate(File directory) {
		if (!directory.exists()) {
			logger.info("The directory {} is not exists!", directory);
			return;
		}
		logger.info("----The directory {} is created.", directory);
		super.onDirectoryCreate(directory);
	}

	@Override
	public void onDirectoryDelete(File directory) {
		logger.info("----The directory {} is deleted.", directory);		
		super.onDirectoryDelete(directory);
	}
}



然后在你的程序中调用它:

FileAlterationMonitor monitor = new FileAlterationMonitor(1000L);// 每隔1000毫秒扫描一次
for (File listenFile:files) {
    FileAlterationObserver observer = new FileAlterationObserver(listenFile, new FileFilterImpl());
    FileListerAdapter listener = new FileListerAdapter();
    observer.addListener(listener);
    monitor.addObserver(observer);
}
monitor.start();

new FileAlterationObserver 的时候还需要使用到一个FileFilter 的接口实现,实现它的accept 方法即可。

这样就可以轻松实现对多个目录的文件监听,需要监听的文件可以使用正则表达式去过滤。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tiantang_1986/article/details/50827048

智能推荐

ubuntu虚拟机终端(terminal)打不开_mengnalisha_csdn的博客-程序员ITS304_虚拟机打不开终端

最近想用cmake-gui编译opencv,发现虚拟机上终端(terminal)打不开,点图标也打不开,ctrl+alt+t也没反应。然后百度了一下ctrl+alt+F1~F6可以打开终端,我试了一下我这上面是ctrl+alt+F5打开了命令行,但是用起来很不方便。网上搜了一下相关文章,基本一致认为是python3.6的问题,我看了一下自己虚拟机上也有python2.7,3.5,3.6,虽然当...

java javaw javaws MC_java和 javaw 以及 javaws的區別_贺定圆的博客-程序员ITS304

java ,javaw 和 javaws 的區別:首先,所有的這些都是java的啟動裝置,java.exe經常使用,當使用命令行輸出到window的時候,會有java.exe進程,通過任務管理器可以看到。通常 我們執行一些小的java程序的時候會有 java.exe進程在運行。javaw.exe對於我們也比較特殊,我們也能夠通過任務管理器看到javaw.exe進程的運行。javaws通常w...

OpenLayers 5 使用GeoJSON数据渲染热力图_战斗中的老胡的博客-程序员ITS304_geojson 热力图

GIS开发中会遇到需要使用热力图Heatmap的时候,openlayers5官方示例给出的是kml文件描述的热力图数据,开发中接触更多的还是GeoJSON格式,本文就使用GeoJSON格式来实现一个热力图。一、实现思路https://openlayers.org/en/latest/examples/heatmap-earthquakes.html官方例子是从一个kml文件解析出生成的热力...

findfirst_当心findFirst()和findAny()_diluan6799的博客-程序员ITS304

那么findFirst()和findAny()有什么问题呢? 从我们的Javadoc( 此处和此处 )可以看出,这两个方法都从流中返回任意元素-除非流具有遇到顺序 ,在这种情况下, findFirst()返回第一个元素。 简单。 一个简单的示例如下所示: public Optional<Customer> findCustomer(String customerId) { ...

idea建立webservice服务端和客户端程序_wfpc__的博客-程序员ITS304_idea webservice

@WebService获取数据库数据idea建立webservice服务端和客户端程序,并把服务端程序放在tomcat首先要建立服务端程序,再建立客户端程序,再把服务端程序放在tomcat下,最后客户端能够获取到tomcat上webservice的数据就可以了。本文是通过建立webservice服务端程序连接另一服务器上的odbc数据源,通过客户端程序传入sql语句获取到返回的odbc数据。...

38.JAVA入门__Switch语句(春夏秋冬)_天天DEBUG的博客-程序员ITS304

Switch语句(春夏秋冬)//case穿透//case穿透//case穿透case后面没有break将会穿透,直到遇到break或者整体switch结束。package class1;// 12个月 输入一个月,判断春夏秋冬import java.util.Scanner;public class thirty_eight {public static void main(String[] args) { // TODO Auto-generated method stub Scan

随便推点

IDEA(2021)最全常用快捷键《必须收藏》_java李杨勇的博客-程序员ITS304

前言:IDEA对新手来说难,可能其中一个原因就是快捷键组合多而且复杂但是它也很全,基本所有功能都可以通过快捷键来完成,可以这么说,如果你掌握了所有IDEA的快捷键使用,那么你完全可以丢掉鼠标,而且不影响开发效率。达到事半功倍的效果最经常使用的十几个快捷键:...

x64 寄存器使用_cosmoslife的博客-程序员ITS304

x64 结构提供了 16 个通用寄存器(以后称为整数寄存器),以及 16 个可供浮点使用的 XMM 寄存器。易失寄存器是由调用方假想的临时寄存器,并要在调用过程中销毁。非易失寄存器需要在整个函数调用过程中保留其值,并且一旦使用,则必须由被调用方保存。下表说明了每种寄存器在整个函数调用过程中的使用方法:Register状态请使用RAX易失的返回

更改csv默认分隔符_albert528108的博客-程序员ITS304_csv默认分隔符

对于带分隔符的文本文件,可以在“文本导入向导”的步骤 2 中将分隔符从制表符更改为其他字符。在步骤 2 中,还可以更改处理连续分隔符(如连续引号)的方式。 有关使用“文本导入向导”的详细信息,请参阅文本导入向导。  更改所有 .csv 文本文件中的分隔符  1、单击 Windows“开始”菜单。  2、单击“控制面板”。  3、打开“区域和语言选项”对话框。

ucint核心边缘分析_ucinet社会网络分析笔记(一)网络密度、中心度、凝聚子群、核心-边缘..._kamalsheel的博客-程序员ITS304

在进行城市网络研究时,通常需要借鉴社会网络的分析方式,对网络各类指标进行计算。主要使用软件为Ucinet 6,在网上可以下载到QQ截图20200814160054.jpg1、数据准备类似于之前讲过的武汉城市圈高德迁徙数据,这里用的是上海都市圈2019年高德迁徙数据,根据前所述方法,在数据库中选取其中的工作日数据并计算日均值。注:高德迁徙数据获取方式目前不便于公开,请勿私信询问。此处上海都市圈范围为...

小高考三门计算机能报大专吗,江苏小高考没过能上大学吗_名字不好写的博客-程序员ITS304

江苏的小高考不过,是不是没有大学上?有的话会是什么大学呢? ...... 小高考不过 高中毕业证都没有哇 所以要努力啊 实在不行的话 高三的时候还可以再考一次 就是跟下届高二的一起考江苏小高考没过,可以参加高考,但能填报志愿吗,能报什么学校,对高考影响大吗? - ...... 可以参加高考,但填志愿无效.根据江苏省教育网上信息:【必修科目和选修科目缺考或未报考的考生,不能取得相应科目的成...