以下为代码和注释,需要的包可以下载:文件监听工具使用示例和需要的jar包.rar (本来想设置为免积分下载,但是找了半天才知道不能自定义下载积分了)
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.File;
/**
* 文件监听示例,在main方法中注明了调用方法。
* 该类实现FileAlterationListener接口,完善“收听者”类,对收听到的文件变动做自定义处理
*/
public class FileListener implements FileAlterationListener {
/* =============================================== Override method() =============================================== */
@Override
public void onStart(FileAlterationObserver fileAlterationObserver) {
//开启监听时默认调用的方法;一般不实现本方法。
}
@Override
public void onDirectoryCreate(File directory) {
/* 开启监听后发现有新目录被创建时需要做的事情 ;
* 但实际测试过程中发现,已有目录被更改时(包括自身文件夹名称更改、下级文件夹更改、下级文件更改),也会触发本方法 ;
*/
System.out.println("检测到[文件夹]【新增】"+directory.getAbsolutePath());
}
@Override
public void onDirectoryChange(File directory) {
/* 开启监听后发现有目录被更改时(包括自身文件夹名称更改、下级文件夹更改、下级文件更改)需要做的事情 ;
* 但实际测试过程中发现,更改文件夹名称时,会同时触发文件夹被删除、文件夹新增事件 ;
*/
System.out.println("检测到[文件夹]【更改】"+directory.getAbsolutePath());
}
@Override
public void onDirectoryDelete(File directory) {
/* 开启监听后发现有目录被删除时需要做的事情 ;
* 但实际测试过程中发现,已有目录被更改时(包括自身文件夹名称更改、下级文件夹更改、下级文件更改),也会触发本方法
*/
System.out.println("检测到[文件夹]【删除】"+directory.getAbsolutePath());
}
@Override
public void onFileCreate(File file) {
/* 开启监听后发现新增文件时需要做的事情 ;
*/
System.out.println("检测到[文件]【新增】"+file.getAbsolutePath());
}
@Override
public void onFileChange(File file) {
/* 开启监听后发现有文件夹被修改时(包括文件名修改、文件内容修改)需要做的事情 ;
*/
System.out.println("检测到[文件]【修改】"+file.getAbsolutePath());
}
@Override
public void onFileDelete(File file) {
/* 开启监听后发现有文件夹被删除时需要做的事情 ;
*/
System.out.println("检测到[文件]【删除】"+file.getAbsolutePath());
}
@Override
public void onStop(FileAlterationObserver fileAlterationObserver) {
//监听结束时默认调用的方法;一般不实现本方法。
}
/* =============================================== Main method() =============================================== */
/**
* <p>文件监听工具的主要思路:</p>
* <p>  · 用监听器每隔指定时间轮询观察者对象,查看是否观察到了指定目录的文件或文件夹变动;</p>
* <p>  · 将变动告知收听者对象,用来对发生的变动做出相应处理</p>
* @param args
*/
public static void main(String[] args) {
//待观察的文件夹
String listenDiretory = "E:/AAAA";
//轮询的时间间隔,单位毫秒
long intervalTime = 1000;
// 创建观察者对象,主要用于观察指定文件(或文件夹)及其子文件(或子文件夹)的变化 ;
/* 若不需要监听子文件夹,可以这样写: new FileAlterationObserver("E:/AAAA", FileFilterUtils.and(FileFilterUtils.fileFileFilter()), null);
*/
FileAlterationObserver observer = new FileAlterationObserver(listenDiretory);
// 创建收听者对象(即自行实现FileAlterationListener接口的类),主要用于完成文件或文件夹变化后需要做的事情 ;
FileListener listener = new FileListener();
// 将收听者对象添加到观察者对象中,表示将观察到的文件或文件夹变化告知收听者
observer.addListener(listener);
// 创建监听者对象,将用于启动后轮询监听观察者对象
/* 第一个参数单位是毫秒,是监听的间隔;第二个参数就是绑定我们之前的观察对象。
* 若有多个目录需要同时监听和处理,则第二个参数可以写成数组形式:new FileAlterationMonitor(10000, new FileAlterationObserver[]{observer1,observer2,observer3});
* 若只有一个目录需要监听,则只需要传入已创建的观察对象observer:new FileAlterationMonitor(10000, observer);
*/
FileAlterationMonitor monitor = new FileAlterationMonitor(intervalTime, observer);
// 开始监听
try {
//开始监控,该方法每隔intervalTime毫秒调用一轮FileAlterationMonitor实现对象的方法,一定会默认执行onStart()和onStop()方法
monitor.start();
//启动程序后,在E:\AAAA文件夹下手动操作文件或文件夹即可在控制台查看打印信息。
System.out.println("\n开始监测文件夹:"+ listenDiretory );
} catch (Exception e) {
e.printStackTrace();
}
}
}