Javaでフォルダを監視する方法について記載します。
目次
フォルダを監視する方法
WatchService を使用して監視を行います。
Pathインタフェース の register メソッドを使用して、監視するフォルダのパスと、監視するイベント(作成、更新、削除)を登録します。
イベント
作成:StandardWatchEventKinds.ENTRY_CREATE
更新:StandardWatchEventKinds.ENTRY_MODIFY
削除:StandardWatchEventKinds.ENTRY_DELETE
更新:StandardWatchEventKinds.ENTRY_MODIFY
削除:StandardWatchEventKinds.ENTRY_DELETE
また、イベントの監視方法には次のものがあります。
イベントの監視方法
No | メソッド | 処理 |
---|---|---|
1 | take() | イベントを取得します。 フォルダに対するイベントがない場合は、イベントがあるまで待機します。 |
2 | poll() | イベントを取得します。 フォルダに対するイベントがない場合は、null を返します。 |
3 | poll(long timeout, TimeUnit unit) | イベントを取得します。 フォルダに対するイベントがない場合は、タイムアウトするまで待機します。 |
1. take メソッドを使用した方法
takeメソッドを使用すると、イベントが発生するまで待機します。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
try(WatchService wsrv = FileSystems.getDefault().newWatchService()){ Path path = Paths.get("/Users/sample"); // 監視するイベントを登録します // 作成:ENTRY_CREATE // 更新:ENTRY_MODIFY // 削除:ENTRY_DELETE Map<WatchKey, Path> WatchMap = new HashMap<>(); WatchMap.put(path.register(wsrv, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE ),path); // フォルダの監視を行う int loopCnt = 0; WatchKey wkey ; do { // 処理回数をカウントアップ loopCnt++; // 3回処理が行われたら監視処理を抜ける if( 3 < loopCnt ) { break; } // 行われた変更(作成、更新、削除)を取得 // イベントが発生していない場合は、イベントが発生するまで待機します wkey = wsrv.take(); // 行われた変更ごとに処理を行います for(WatchEvent<?> event : wkey.pollEvents()){ // イベントが行われたファイル・ディレクトリ Path fileName = (Path)event.context(); System.out.print(fileName); if( event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE) ) { // 作成イベントの処理 }else if( event.kind().equals(StandardWatchEventKinds.ENTRY_MODIFY) ) { // 更新イベントの処理 }else if( event.kind().equals(StandardWatchEventKinds.ENTRY_DELETE) ) { // 削除イベントの場合 } } }while(wkey.reset()); }catch( Exception e ){ e.printStackTrace(); } |
2. poll メソッド(引数なし)を使用した方法
poll メソッド(引数なし)を使用すると、イベントが発生していない場合は null を返します。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
try(WatchService wsrv = FileSystems.getDefault().newWatchService()){ Path path = Paths.get("/Users/sample"); // 監視するイベントを登録します // 作成:ENTRY_CREATE // 更新:ENTRY_MODIFY // 削除:ENTRY_DELETE Map<WatchKey, Path> WatchMap = new HashMap<>(); WatchMap.put(path.register(wsrv, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE ),path); // フォルダの監視を行う int loopCnt = 0; WatchKey wkey ; do { // 3秒スリープ Thread.sleep(3000); // 処理回数をカウントアップ loopCnt++; // 3回処理が行われたら監視処理を抜ける if( 3 < loopCnt ) { break; } // 行われた変更(作成、更新、削除)を取得 // 何も行われていない場合は、nullを返します。 wkey = wsrv.poll(); if( wkey == null ) { continue; } // 行われた変更ごとに処理を行います。 for(WatchEvent<?> event : wkey.pollEvents()){ // イベントが行われたファイル・ディレクトリ Path fileName = (Path)event.context(); System.out.print(fileName); if( event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE) ) { // 作成イベントの処理 }else if( event.kind().equals(StandardWatchEventKinds.ENTRY_MODIFY) ) { // 更新イベントの処理 }else if( event.kind().equals(StandardWatchEventKinds.ENTRY_DELETE) ) { // 削除イベントの処理 } } }while( wkey == null || wkey.reset()); // イベントが発生しない場合、wkeyがnullになるので条件に指定 }catch( Exception e ){ e.printStackTrace(); } |
3. poll メソッド(引数あり)を使用した方法
poll メソッド(引数なし)は、イベントが発生していない場合、すぐに null を返しますが、poll メソッド(引数あり)を使用すると、イベントが発生していない場合、指定した待機時間後にタイムアウトします。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
try(WatchService wsrv = FileSystems.getDefault().newWatchService()){ Path path = Paths.get("/Users/sample"); // 監視するイベントを登録します // 作成:ENTRY_CREATE // 更新:ENTRY_MODIFY // 削除:ENTRY_DELETE Map<WatchKey, Path> WatchMap = new HashMap<>(); WatchMap.put(path.register(wsrv, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE ),path); // フォルダの監視を行う int loopCnt = 0; WatchKey wkey ; do { // 処理回数をカウントアップ loopCnt++; // 3回処理が行われたら監視処理を抜ける if( 3 < loopCnt ) { break; } // 行われた変更(作成、更新、削除)を取得 // 3秒間何も行われていない場合は、nullを返します。 wkey = wsrv.poll(3, TimeUnit.SECONDS); if( wkey == null ) { continue; } // 行われた変更ごとに処理を行います。 for(WatchEvent<?> event : wkey.pollEvents()){ // イベントが行われたファイル・ディレクトリ Path fileName = (Path)event.context(); System.out.print(fileName); if( event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE) ) { // 作成イベントの場合 }else if( event.kind().equals(StandardWatchEventKinds.ENTRY_MODIFY) ) { // 更新イベントの場合 }else if( event.kind().equals(StandardWatchEventKinds.ENTRY_DELETE) ) { // 削除イベントの場合 } } }while( wkey == null || wkey.reset()); // イベントが発生しない場合、wkeyがnullになるので条件に指定 }catch( Exception e ){ e.printStackTrace(); } |