Java:フォルダ監視(watch service)で変更を検知する方法
ファイル監視は、ログの更新検知、外部連携ファイルの受信待ち処理、バッチ処理のトリガーなど、業務システムやツール作成で頻繁に必要になる機能です。
Javaには標準で**WatchService API**が用意されており、追加ライブラリなしでフォルダの変更を監視できます。
本記事では、WatchService の基本的な使い方から、作りがちな落とし穴・例外パターンまでまとめています。
🔍 WatchService で検知できるイベント種類
| イベント種類 | 内容 |
|---|---|
| ENTRY_CREATE | ファイル・フォルダが作成されたタイミング |
| ENTRY_MODIFY | 既存ファイルの更新 |
| ENTRY_DELETE | 削除時 |
※Windows と Linux では MODIFY の挙動が異なることがあります。
(例)Windows は保存時に複数回 MODIFY が発生しがちです。
📌 基本サンプル:フォルダ監視してイベントを表示するコード
💡 注意点・よくある落とし穴
| 問題点 | よくある症状 | 対策 |
|---|---|---|
| MODIFY が複数回発生 | Windows で保存時に連続イベント | 一定時間バッファリング or ハッシュ比較 |
| サブフォルダの変更が検知されない | 下層フォルダ変更が無視される | 再帰登録が必要 |
| 監視対象フォルダが消えると止まる | 例外またはreset()がfalseに | 再監視ロジックを入れる |
| 巨大ファイルアップロード中にイベント発火 | 完了前に処理が動く | サイズ・ロック状態チェックが必要 |
📌 サブフォルダも監視する再帰登録版サンプル
🧰 業務システムでの実運用ポイント
| 内容 | 推奨事項 |
|---|---|
| CPU 負荷 | take() で待機するため基本問題なし |
| ログ運用 | 必ずファイル名・日時で記録 |
| 存在確認 | 大容量ファイルの場合「完成」判定が必要 |
| 再起動バックアップ | JVMプロセスが停止すると監視も停止 → JP1等のジョブ管理併用推奨 |
まとめ
Java の WatchService を利用すると、追加ライブラリなしでフォルダの変更を自動検知できます。
サーバー間連携やバッチ処理トリガー、ログ監視ツールなど様々なシーンで有用ですが、OSごとの挙動差や複数イベント発火といった癖があるため、実装時には考慮する必要があります。
標準APIだけで完結するため小規模な監視機能であれば十分活用できます。
