ファイルの変更を検知
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();
}
}