在開發中經常會用到監控文件或是目錄的狀態,如果你還在手寫輪巡掃描文件的話,那你久out了。
1. Commons io為我們提供了一套可靠、高性能的一套文件系統監控API
1.1. 需要的jar包如下,具體版本可根據自己需要選取:
- commons-logging-1.1.1.jar
- log4j-1.2.15.jar
1.2. 在文件監控系統的中,首先要理解幾個角色:
- Observer:觀察者,擁有文件路徑、文件過濾器、文件比較器(監控器用它來判斷文件的狀態變化:新增、修改、刪除、等等),可以向他添加相關的監聽器;
- Listener:監聽器,當文件系統發生變化時,將會執行它的相關方法。其實,在文件狀態發生變化時,觀察者會根據文件比較器來拿到文件的變化狀態,根據變化狀態的不同來調用監聽器中不同的方法;
- Monitor:監控器,可設置監控文件系統的時間間隔、文件觀察者等信息。
1.3. 代碼實現步驟如下:
1.3.1. 實現監聽器
import java.io.File; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 文件監聽器 * @author leocook(leocook@163.com) * @version 1.0 * @date 2014-06-30 */ public class MyFileListener extends FileAlterationListenerAdaptor { private static Log log = LogFactory.getLog(MyFileListener.class); /** * 目錄發生變化 * @param directory 發生變化的目錄 */ @Override public void onDirectoryChange(File directory) { super.onDirectoryChange(directory); log.info("文件夾改變:" +directory.getAbsolutePath()); } /** * 新建目錄 * @param directory 被新建的目錄 */ @Override public void onDirectoryCreate(File directory) { super.onDirectoryCreate(directory); log.info("新建目錄:" +directory.getAbsolutePath()); } /** * 刪除目錄 * @param directory 被刪除目錄 */ @Override public void onDirectoryDelete(File directory) { super.onDirectoryDelete(directory); log.info("刪除目錄:" +directory.getAbsolutePath()); } /** * 文件發生變化 * @param file 發生變化的文件 */ @Override public void onFileChange(File file) { super.onFileChange(file); log.info("修改文件:" +file.getAbsolutePath()); } /** * 新建文件 * @param file 被新建的文件 */ @Override public void onFileCreate(File file) { super.onFileCreate(file); log.info("新建文件:"+file.getAbsolutePath()); } /** * 刪除文件 * @param file 被刪除的文件 */ @Override public void onFileDelete(File file) { super.onFileDelete(file); log.info("刪除文件:" +file.getAbsolutePath()); } /** * 檢查文件開始 * @param observer 文件觀察者 */ @Override public void onStart(FileAlterationObserver observer) { super.onStart(observer); // log.info("開始檢查..."); } /** * 檢查文件結束 * @param observer 文件觀察者 */ @Override public void onStop(FileAlterationObserver observer) { super.onStop(observer); // log.info("結束檢查..."); } }
1.3.2. 觀察者、監控器的調用
import org.apache.commons.io.monitor.FileAlterationMonitor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 文件系統監測測試類 * @author leocook(leocook@163.com) * @version 1.0 * @date 2014-06-30 */ public class Main { private static Log log = LogFactory.getLog(Main.class); /** * 測試文件系統監測 * @param String[] args */ public static void main(String[] args) { long interval = 1000; final String path = "/home/leocook/test"; FileAlterationObserver observer = null; try { observer = new FileAlterationObserver(path, null, null); //添加監聽器 observer.addListener(new MyFileListener()); FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer); monitor.start(); } catch (Exception e) { log.error("Exception", e); } } }
1.4. Commons io包中對文件系統監控體系中,還有類org.apache.commons.io.monitor.FileEntry,關於它的具體用法筆者不再一一介紹。
1.5. 參考鏈接
- http://blog.csdn.net/xiaoyezi1001/article/details/28095281