I want to watch (monitor) multiple directories using Java NIO WatchService.
My problem here is the number of directories to watch is dynamic and the user can add any number of directories to the WatchService. Is this achievable?
It is possible to register multiple paths with the same WatchService. Each path gets its own WatchKey. The take() or poll() will then return the WatchKey corresponding to the path that was modified.
See Java's WatchDir example for details.
Following the same link as in previous answers: Oracle WatchDir.
You can create first the WatchService:
WatchService watchService = FileSystems.getDefault().newWatchService();
At this point you can add many paths to the same WatchService:
Path path1 = Paths.get("full\path\1\\");
path1.register(watchService,
StandardWatchEventKinds.ENTRY_CREATE);
Path path2 = Paths.get("full\path\2\\");
path2.register(watchService,
StandardWatchEventKinds.ENTRY_CREATE);
Then you can manage the events as follow:
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
System.out.println(
"Event kind:" + event.kind()
+ ". File affected: " + event.context() + ".");
}
key.reset();
}
Now, if you want to get more information about where was raised the event, you can create a map to link the key and the path by example (You can consider create the variable as class level following your needs):
Map<WatchKey, Path> keys;
In this example you can have the paths inside a list, then you need to loop into it and add each path to the same WatchService:
for (Path path : paths) {
WatchKey key = path.register(
watchService,
StandardWatchEventKinds.ENTRY_CREATE);
keys.put(key, path);
}
Now to manage the events, you can add something like it:
WatchKey key;
while ((key = watchService.take()) != null) {
Path path = keys.get(key);
// More code here.
key.reset();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With