1. 程式人生 > >通過 Java 去監測某個目錄下的檔案變動(commons.io方式)

通過 Java 去監測某個目錄下的檔案變動(commons.io方式)

org.apache.commons.io包

使用Commons-io的 monitor 下的相關類可以處理對檔案進行監控,它採用的是觀察者模式來實現的。

  1. 可以監控資料夾的建立、刪除和修改
  2. 可以監控檔案的建立、刪除和修改
  3. 採用的是觀察者模式來實現的
  4. 採用執行緒去定時去重新整理檢測檔案的變化情況

下面是在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