import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.WatchEvent; import java.nio.file.WatchEvent.Kind; import java.nio.file.WatchKey; import java.nio.file.WatchService; import java.util.Map; import java.util.WeakHashMap; import static java.nio.file.StandardWatchEventKind.*; public class FileMonTest { public static void main(String[] args) throws Exception { if (args.length != 1) { throw new Exception("Usage: FileMonTest "); } WatchService ws = FileSystems.getDefault().newWatchService(); Path p = Paths.get(args[0]); register(ws, p); while (true) { WatchKey k = ws.take(); for (WatchEvent e : k.pollEvents()) { Object ctx = e.context(); if (ctx instanceof Path) { ctx = keys.get(k).resolve((Path) ctx); } int count = e.count(); if (count > 1) { System.out.print("[" + count + "x] "); } Kind kind = e.kind(); if (kind == ENTRY_CREATE) { System.out.println("Created: " + ctx); register(ws, (Path) ctx); } else if (kind == ENTRY_MODIFY) { System.out.println("Modified: " + ctx); } else if (kind == ENTRY_DELETE) { System.out.println("Deleted: " + ctx); } else { System.out.println("Other event: " + kind + " on " + ctx); } } k.reset(); } } private static final Map keys = new WeakHashMap(); private static void register(final WatchService ws, Path p) throws IOException { Files.walkFileTree(p, new SimpleFileVisitor() { public @Override FileVisitResult preVisitDirectory(Path dir) { try { keys.put(dir.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY, OVERFLOW), dir); System.out.println("Watching: " + dir); return FileVisitResult.CONTINUE; } catch (IOException x) { System.err.println("watch " + dir + ": " + x); return FileVisitResult.SKIP_SUBTREE; } } public @Override FileVisitResult preVisitDirectoryFailed(Path dir, IOException x) { System.err.println(dir + ": " + x); return FileVisitResult.CONTINUE; } public @Override FileVisitResult visitFileFailed(Path file, IOException x) { System.err.println(file + ": " + x); return FileVisitResult.CONTINUE; } }); } }