import java.nio.file.*; import static java.nio.file.StandardWatchEventKinds.*; sclass FileWatchService implements AutoCloseable { WatchService watchService = FileSystems.getDefault().newWatchService(); new MultiMap> listeners; int interval = 50; // larger interval helps show less duplicate events (https://stackoverflow.com/questions/16777869/java-7-watchservice-ignoring-multiple-occurrences-of-the-same-event/34818620#34818620) Thread pollThread; public void close { dispose watchService; } WatchKey addListener(File path, IVF1 listener, WatchEvent.Kind... eventKinds) { startPollThread(); WatchKey key = path.toPath().register(watchService, eventKinds); listeners.put(key, listener); ret key; } synchronized void startPollThread() { if (pollThread != null) ret; pollThread = startThread("File Watch Service", r { while licensed { WatchKey key = service.poll(10, TimeUnit.SECONDS); if (key != null) { Path dir = cast key.watchable(); sleep(interval); L> events = key.pollEvents(); new LinkedHashSet changedFiles; for (WatchEvent event : reversedIterator(events)) pcall { final Path changed = (Path) event.context(); File full = newFile(dir.toFile(), changed.toFile().getPath()); changedFiles.add(full); //print("WatchService Changed: " + full + ", " + event.kind()); } for (File f : changedFiles) pcallFAll(listeners.get(key), f); key.reset(); } } }); } }