java監控指定路徑下文件及文件夾變化


之前用jdk7的WatchService API(java.nio.file包)來做目錄下的子文件監控,后改為使用commons-io包。主要有下面幾點不同:1. WatchService是采用掃描式的,效率低,commons-io是使用事件驅動的,效率高;2. WatchService代碼寫起來費勁 3.  WatchService不能監聽到孫文件目錄(多級目錄),事先父文件夾需要存在,而FileAlterationObserver可以監聽多級目錄,父目錄事先不存在也沒問題。http://commons.apache.org/proper/commons-io/,

commons-io功能介紹: 
  1)  工具類   FilenameUtils
  2) FileMonitor工具類包,監聽該文件及文件夾變化
  3)filters過濾org.apache.commons.io.filefilter
  4) Comparators  org.apache.commons.io.comparator包下的工具類,可以方便進行文件的比較
  5) input/output包  common io的org.apache.commons.io.input / org.apache.commons.io.output 包,其中好特別的是TeeOutputStream能將一個輸入流分別輸出到兩個輸出流

commons-io-2.3.jar 中,有實現文件監控的類,在org.apache.commons.io.monitor包下,

主要包括 observer ,listener,monitor 含義你懂得滴,典型觀察者模式,直接上代碼:

listener:

/*
* Version 1.0.0
* Created on 2017年12月23日
* Copyright ReYo.Cn
*/
package reyo.sdk.utils.test.file;

import java.io.File;

import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;

/**
* <B>創  建 人:</B>AdministratorReyoAut <BR>
* <B>創建時間:</B>2017年12月23日 下午9:25:21<BR>
*
* @author ReYo
* @version 1.0
*/
public class ReYoFileListener implements FileAlterationListener {

	ReYoFileMonitor monitor = null;

	@Override
	public void onStart(FileAlterationObserver observer) {
		//System.out.println("onStart");
	}

	@Override
	public void onDirectoryCreate(File directory) {
		System.out.println("onDirectoryCreate:" + directory.getName());
	}

	@Override
	public void onDirectoryChange(File directory) {
		System.out.println("onDirectoryChange:" + directory.getName());
	}

	@Override
	public void onDirectoryDelete(File directory) {
		System.out.println("onDirectoryDelete:" + directory.getName());
	}

	@Override
	public void onFileCreate(File file) {
		System.out.println("onFileCreate:" + file.getName());
	}

	@Override
	public void onFileChange(File file) {
		System.out.println("onFileCreate : " + file.getName());
	}

	@Override
	public void onFileDelete(File file) {
		System.out.println("onFileDelete :" + file.getName());
	}

	@Override
	public void onStop(FileAlterationObserver observer) {
		//System.out.println("onStop");
	}

}

 monitor

/*
* Version 1.0.0
* Created on 2017年12月23日
* Copyright ReYo.Cn
*/
package reyo.sdk.utils.test.file;

import java.io.File;

import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

/**
* <B>創  建 人:</B>AdministratorReyoAut <BR>
* <B>創建時間:</B>2017年12月23日 下午9:26:08<BR>
*
* @author ReYo
* @version 1.0
*/
public class ReYoFileMonitor {

	FileAlterationMonitor monitor = null;

	public ReYoFileMonitor(long interval) throws Exception {
		monitor = new FileAlterationMonitor(interval);
	}

	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();
	}

	public static void main(String[] args) throws Exception {
		ReYoFileMonitor m = new ReYoFileMonitor(5000);
		m.monitor("D:\\temp", new ReYoFileListener());
		m.start();
	}
}

 啟動后,每5秒掃描指定路徑下文件的變化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM