之前用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秒掃描指定路徑下文件的變化