import java.io.*; import java.nio.file.*; public class Tmp { public static void main(String [] args) throws IOException { int count = 0; Path path = Paths.get("C:\\tmp\\"); WatchService ws = null; try { ws = FileSystems.getDefault().newWatchService(); path.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW); } catch (IOException ioe) { ioe.printStackTrace(); } while(true) { WatchKey key = null; try { key = ws.take(); } catch(InterruptedException ie) { ie.printStackTrace(); } for(WatchEvent<?> event: key.pollEvents()) { switch(event.kind().name()) { case "OVERFLOW": System.out.println(++count + ": OVERFLOW"); break; case "ENTRY_MODIFY": System.out.println(++count + ": File " + event.context() + " is changed!"); break; case "ENTRY_CREATE": System.out.println(++count + ": File " + event.context() + " is created!"); break; case "ENTRY_DELETE": System.out.println(++count + ": File " + event.context() + " is deleted!"); break; default: System.out.println(++count + ": UNKNOWN EVENT!"); } } key.reset(); } } }
When I run this and then opened the Notepad++ and then created a new empty file and saved it as a.txt
in the C:\tmp\
directory I got the output:
1: File a.txt is created! 2: File a.txt is deleted! 3: File a.txt is created!
Why is that? It looks like the file was created and then deleted and then created again. Why?
When I put some text in the file and saved it the output was:
4: File a.txt is changed! 5: File a.txt is changed!
Why did it change twice?
A watch service that watches registered objects for changes and events. For example a file manager may use a watch service to monitor a directory for changes so that it can update its display of the list of files when files are created or deleted.
Create a WatchService "watcher" for the file system. For each directory that you want monitored, register it with the watcher. When registering a directory, you specify the type of events for which you want notification. You receive a WatchKey instance for each directory that you register.
Watch Service's Modify event generates two events. When we modify an already existing file, the file system first creates it with 0 bytes and fires a modify event and then writes data on it. Then it fires the modify event again. That's why It was showing two modify events. So What I have done to solve this problem, I just use counter to check my task should be triggered only once on even count
Path path = null; int count = 0; try { path = Paths.get(new Utility().getConfDirPath()); System.out.println("Path: " + path); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } WatchService watchService = null; try { watchService = FileSystems.getDefault().newWatchService(); path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY,StandardWatchEventKinds.ENTRY_DELETE); } catch (IOException ioe) { ioe.printStackTrace(); } while(true) { WatchKey key = null; try { key = watchService.take(); } catch(InterruptedException ie) { ie.printStackTrace(); } for(WatchEvent<?> event: key.pollEvents()) { switch(event.kind().name()) { case "ENTRY_MODIFY": System.out.println(++count + ": File " + event.context() + " is changed!"); if (count%2==0) { doOnChange(); // do whatever you want } break; case "ENTRY_DELETE": System.out.println(++count + ": File " + event.context() + " is deleted!"); break; default: System.out.println(++count + ": UNKNOWN EVENT!"); } } // reset the key boolean valid = key.reset(); if (!valid) { System.out.println("Key has been unregistered"); } }
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