通過 Java 去監測某個目錄下的檔案變動(commons.io方式)
阿新 • • 發佈:2018-12-07
org.apache.commons.io包
使用Commons-io的 monitor 下的相關類可以處理對檔案進行監控,它採用的是觀察者模式來實現的。
- 可以監控資料夾的建立、刪除和修改
- 可以監控檔案的建立、刪除和修改
- 採用的是觀察者模式來實現的
- 採用執行緒去定時去重新整理檢測檔案的變化情況
下面是在SpringBoot環境的應用:
1、引入commons-io包,需要2.0以上
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
2,編寫繼承FileAlterationListenerAdaptor的類ListenerAdaptor檔案變化監聽器
在Apache的Commons-IO中有關於檔案的監控功能的程式碼. 檔案監控的原理如下:
- 由檔案監控類FileAlterationMonitor中的執行緒不停的掃描檔案觀察器FileAlterationObserver,
- 如果有檔案的變化,則根據相關的檔案比較器,判斷檔案時新增,還是刪除,還是更改。(預設為1000毫秒執行一次掃描)
package com.test.service.MyService; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.File; /** * @author selfimpr626 */ @Component public class ListenerAdaptor extends FileAlterationListenerAdaptor { /** * 業務 **/ @Resource(name = "myServiceImpl") private MyServiceImpl myService; /** * 目錄建立 **/ @Override public void onDirectoryCreate(File directory) { System.out.println("建立新目錄"); } /** * 目錄修改 **/ @Override public void onDirectoryChange(File directory) { System.out.println("目錄修改"); } /** * 目錄刪除 **/ @Override public void onDirectoryDelete(File directory) { System.out.println("目錄刪除"); } /** * 檔案建立(對於檔名的修改,會先觸發檔案新增方法,再觸發檔案刪除方法) **/ @Override public void onFileCreate(File file) { myService.createFile(file); System.out.println("檔案建立:" + file); } /** * 檔案修改 **/ @Override public void onFileChange(File file) { System.out.println("檔案修改"); } /** * 檔案建立刪除 **/ @Override public void onFileDelete(File file) { System.out.println("刪除檔案:" + file); } /** * 掃描開始 **/ @Override public void onStart(FileAlterationObserver observer) { } /** * 掃描結束 **/ @Override public void onStop(FileAlterationObserver observer) { } }
3,開啟檔案監聽,點選進入此處的@PostConstruct註解解析
package com.test; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.io.filefilter.HiddenFileFilter; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.commons.io.monitor.FileAlterationMonitor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.PostConstruct; import java.io.File; import java.util.concurrent.TimeUnit; /** * @author selfimpr626 */ public class ListenerServer { @Autowired private ListenerAdaptor listenerAdaptor; @PostConstruct public void executeListener(){ // 設定監控目錄 String monitorDir = "D:\\test\\file"; // 設定掃描間隔 long interval = TimeUnit.SECONDS.toMillis(5); // 建立過濾器 // 匹配目錄 IOFileFilter directories = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE); // 匹配txt字尾檔案 IOFileFilter files = FileFilterUtils.and(FileFilterUtils.fileFileFilter(), FileFilterUtils.suffixFileFilter(".txt")); // 過濾符合:對應可視目錄 和 字尾為".txt"的檔案 IOFileFilter filter = FileFilterUtils.or(directories, files); // 使用過濾器:裝配過濾器,生成監聽者 FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir), filter); // 不使用過濾器的情況 //FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir)); // 向監聽者新增監聽器,並注入業務服務 observer.addListener(listenerAdaptor); // 建立檔案變化監聽器 FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor(interval, observer); try { // 開啟監聽 fileAlterationMonitor.start(); } catch (Exception e) { e.printStackTrace(); } } }
另外:還可以應用File Watch Service方式,啟一個Listener監聽器,去監測某個目錄下的檔案變動
https://blog.csdn.net/weixin_41888813/article/details/84859670