因实际测试,需要对某个目录进行日常监控。
在此,使用java的ScheduledExecutorService和TimerTask实现如下场景:
1.监控报告有更新的文件;
2.监控报告增加的文件;
3.监控报告被删除的文件;
4.任务每隔20秒钟运行一次;
5.只对感兴趣的后缀名文件进行监控;
直接上代码:
package com.filetool.watch;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class StartWatch {
public static void main(String[] args){
final ScheduledExecutorService schedule = Executors.newScheduledThreadPool(2);
final String watchedDir = "D:/mytest";
final String[] suffixs = {"txt","log","doc","docx","pdf"};
final ArrayList<String> curFiles = new ArrayList<String>();
final ArrayList<String> hisFiles = new ArrayList<String>();
final ArrayList<String> subdirs = new ArrayList<String>();
final Map<String,String> addMap = new HashMap<String,String>();
final Map<String,String> delMap = new HashMap<String,String>();
final Map<String,String> curMap = new HashMap<String,String>();
final Map<String,String> oldMap = new HashMap<String,String>();
final Map<String,String> updMap = new HashMap<String,String>();
final TimerTask getCurFilesTask = new TimerTask()
{
int loop = 0;
@Override
public void run() {
try{
int old = 0;
if( 0 == loop ){
getFiles(curFiles,subdirs,watchedDir,suffixs);
for(String ss : curFiles){
hisFiles.add(ss);
curMap.put(ss, ""+(new File(ss)).lastModified());
oldMap.put(ss, ""+(new File(ss)).lastModified());
}
}else{
old = oldMap.size();
getFiles(curFiles,subdirs,watchedDir,suffixs);
for(String ss : curFiles){
String lastValue = oldMap.get(ss);
if(null == lastValue){
addMap.put(ss, ""+(new File(ss)).lastModified());
System.out.println("add--> "+ss);
}else if(!lastValue.equals(""+(new File(ss)).lastModified())){
updMap.put(ss, ""+(new File(ss)).lastModified());
System.out.println("upd--> "+ss);
}
curMap.put(ss, ""+(new File(ss)).lastModified());
}
//addMap处理,略
//updMap处理,略
for(Map.Entry<String, String> entry : oldMap.entrySet()){
if(!curMap.containsKey(entry.getKey())){
delMap.put(entry.getKey(), entry.getValue());
System.out.println("del--> "+entry.getKey());
}
}
//delMap处理,略
oldMap.clear();
for(Map.Entry<String, String> entry : curMap.entrySet()){
oldMap.put(entry.getKey(), entry.getValue());
}
}
loop++;
System.out.println((new Date()).toString()+",loop="+(loop)+",CUR="
+curMap.size()+",OLD="
+old +",ADD="
+addMap.size()+",DEL="
+delMap.size()+",UPD="
+updMap.size());
curFiles.clear();
curMap.clear();
addMap.clear();
updMap.clear();
delMap.clear();
}catch(Exception e){
e.printStackTrace();
}
}
};
schedule.scheduleAtFixedRate(getCurFilesTask, 0, 20, TimeUnit.SECONDS);
}
//按指定后缀扫出指定目录下所有文件
public static void getFiles(ArrayList<String> filelist,ArrayList<String> subdirlist,String filePath,String[] fileKeys) {
File root = new File(filePath);
File[] files = root.listFiles();
//非空目录才进行处理
if(files != null){
for (File file : files) {
try{
if (file.isDirectory()&&file.canRead()) {
getFiles(filelist,subdirlist,file.getAbsolutePath(),fileKeys);
subdirlist.add(file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf(File.separator)+1));
}
if(file.isFile()) {
String strFileName = file.getAbsolutePath();
String suffix = strFileName.substring(strFileName.lastIndexOf(".")+1);
for(String s:fileKeys){
if(suffix.toLowerCase().equals(s)){
filelist.add(strFileName);
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
输出如下:
Fri Oct 28 17:46:55 CST 2016,loop=1,CUR=12,OLD=0,ADD=0,DEL=0,UPD=0
Fri Oct 28 17:47:15 CST 2016,loop=2,CUR=12,OLD=12,ADD=0,DEL=0,UPD=0
add--> D:\mytest\docshare\asfdasdfa\test01 - 副本 (7).txt
Fri Oct 28 17:47:35 CST 2016,loop=3,CUR=13,OLD=12,ADD=1,DEL=0,UPD=0
upd--> D:\mytest\docshare\asfdasdfa\test01.txt
del--> D:\mytest\docshare\asfdasdfa\test01 - 副本 (6).txt
Fri Oct 28 17:47:55 CST 2016,loop=4,CUR=12,OLD=13,ADD=0,DEL=1,UPD=1
add--> D:\mytest\docshare\asfdasdfa\test01 - 副本 - 副本 (6).txt
add--> D:\mytest\docshare\asfdasdfa\test01 - 副本 - 副本 (7).txt
Fri Oct 28 17:48:15 CST 2016,loop=5,CUR=14,OLD=12,ADD=2,DEL=0,UPD=0
upd--> D:\mytest\docshare\asfdasdfa\test01.txt
del--> D:\mytest\docshare\asfdasdfa\test01 - 副本 - 副本 (3).txt
Fri Oct 28 17:48:35 CST 2016,loop=6,CUR=13,OLD=14,ADD=0,DEL=1,UPD=1