Commons-IO:ディレクトリの内容変更を検知するio.monitorパッケージ

  • 6
    Like
  • 0
    Comment
More than 1 year has passed since last update.

ファイルの変更を検知

Commons-IOの中でも一風変わった機能があるパッケージである io.monitorパッケージ、これらはあるディレクトリ内のファイル変更や削除などを自動検知する仕組みを提供します。

提供されるクラスは以下のものです。デザインパターンの1つ、Observerパターンで作られています。

登場するクラスたち

io.monitorパッケージの中で、実際に扱うクラスたちは以下のものです。

  • FileAlterationMonitor
    • Observerを管理し、ディレクトリを監視する。監視の開始、終了を制御。
  • FileAlterationObserver
    • Listenerを扱う。複数のListenerを扱うことが可能。
  • FileAlterationListener(インタフェース)
    • ディレクトリの変更やファイルの作成など、検出する内容にあわせたメソッドを定義。
    • 空の実装クラス FileAlterationListenerAdaptor が存在する

使い方

以下、簡単な使い方です。

  • 監視するディレクトリを指定する
  • Monitorのインスタンスを生成
  • Observerのインスタンスを生成
  • Listenerのインスタンスを生成
    • 監視する内容を実装する
  • ObserverにListenerを登録する
  • MonitorにObserverを登録する
  • Monitorを起動する

実装例

MonitorSample.java(抜粋)
@Log4j2
public class MonitorSample
    public void start() throws Exception {
        // Monitorの生成。監視間隔はミリ秒。
        FileAlterationMonitor monitor = new FileAlterationMonitor(2000);
        // Observerの生成。監視するディレクトリを指定。
        File dir = new File("E:/target");
        FileAlterationObserver observer = new FileAlterationObserver(dir);
        // Listenerを生成して監視する内容を実装
        FileAlterationListener listener = new FileAlterationListenerAdaptor() {
            public void onDirectoryChange(File directory) {
                log.debug("onDirectoryChange:{}" , directory.getName());
                super.onDirectoryChange(directory);
            }

            @Override
            public void onDirectoryCreate(File directory) {
                log.debug("onDirectoryCreate:{}" , directory.getName());
                super.onDirectoryCreate(directory);
            }

            @Override
            public void onDirectoryDelete(File directory) {
                log.debug("onDirectoryDelete:{}" , directory.getName());
                super.onDirectoryDelete(directory);
            }

            @Override
            public void onFileChange(File file) {
                log.debug("onFileChange:{}" , file.getName());
                super.onFileChange(file);
            }

            @Override
            public void onFileCreate(File file) {
                log.debug("onFileCreate:{}" , file.getName());
                super.onFileCreate(file);
            }

            @Override
            public void onFileDelete(File file) {
                log.debug("onFileDelete:{}" , file.getName());
                super.onFileDelete(file);
            }

            @Override
            public void onStart(FileAlterationObserver observer) {
                log.debug("onStart:{}" , observer.toString());
                super.onStart(observer);
            }

            @Override
            public void onStop(FileAlterationObserver observer) {
                log.debug("onStop:{}" , observer.toString());
                super.onStop(observer);
            }
        };
        // ObserverにListerを登録
        observer.addListener(listener);
        // MonitorにObserverを登録
        monitor.addObserver(observer);
        // Monitorの起動
        monitor.start();
    }
}