ご推察のとおり、1つのWatchServiceに複数のPathを登録することで、複数のディレクトリが監視対象に入ります。1つのディレクトリ監視は、その指定したディレクトリのみ監視しますので、階層が異なるディレクトリがある場合は、その階層以下にあるディレクトリを登録しなければなりません。
java
1package sample;
2
3import java.io.File;
4import java.io.IOException;
5import java.nio.file.FileSystem;
6import java.nio.file.FileSystems;
7import java.nio.file.Path;
8import java.nio.file.StandardWatchEventKinds;
9import java.nio.file.WatchEvent;
10import java.nio.file.WatchKey;
11import java.nio.file.WatchService;
12import java.util.ArrayList;
13import java.util.Arrays;
14import java.util.List;
15
161718
19public class Watcher {
20
21 private static final List<String> watchDir = Arrays.asList("D:\\app\\work\\watchDir","D:\\app\\work\\watchDir\\sub","D:\\app\\work\\watchDir\\ex");
22
23 private static volatile boolean stop = false;
24
25 public static void main(String[] args) throws IOException, InterruptedException {
26 FileSystem fileSystem = FileSystems.getDefault();
27 WatchService watchService = fileSystem.newWatchService();
28
29 List<WatchKey> watchKeys = new ArrayList<>();
30 watchDir.stream().forEach(dir -> {
31 Path watchDirPath = new File(dir).toPath();
32 WatchKey watchKey;
33 try {
34 watchKey = watchDirPath.register(watchService,
35 StandardWatchEventKinds.ENTRY_CREATE,
36 StandardWatchEventKinds.ENTRY_MODIFY,
37 StandardWatchEventKinds.ENTRY_DELETE
38 );
39 watchKeys.add(watchKey);
40 } catch (IOException e) {
41 e.printStackTrace();
42 }
43
44 });
45
46 Runtime.getRuntime().addShutdownHook(new Thread() {
47 @Override
48 public void run() {
49 stop = false;
50 }
51 });
52
53 while (!Thread.currentThread().isInterrupted() && !stop) {
54 System.out.println("Watching...");
55
56 WatchKey take = watchService.take();
57 System.out.println("watch name:" + take.watchable().toString());
58
59 if ( take.isValid()) {
60 List<WatchEvent<?>> events = take.pollEvents();
61
62 // 検出したイベンドがListで返されるので内容を解析
63 events.stream().forEach(ev -> {
64 System.out.println("イベント:" + ev.kind());
65 System.out.println("ファイル:" + ev.context());
66 System.out.println("回数 :" + ev.count());
67 });
68
69 // イベントを送出し終わった後はリセットして監視再開
70 take.reset();
71 }
72 }
73
74 System.out.println("close.");
75 watchKeys.stream().forEach(dir -> {
76 dir.cancel();
77 });
78 }
79
80}
参考サイト:Yosuke’s Blog|WatchServiceを利用したIOイベントハンドリング
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/06/28 14:30 編集
2016/06/28 15:38
2016/06/28 19:31
2016/06/30 08:05
2016/06/30 08:25
2016/06/30 14:10
退会済みユーザー
2016/06/30 17:13 編集
2016/07/01 17:10