Java代码实现文件夹变动监控

因实际测试,需要对某个目录进行日常监控。

在此,使用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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值