Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does WatchService generate so many operations?

Tags:

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?

like image 200
Pawel P. Avatar asked Apr 21 '13 16:04

Pawel P.


People also ask

What is WatchService in Java?

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.

Can we monitor a directory for adding new files in Java?

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.


1 Answers

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");             }          }     
like image 139
Rohit Luthra Avatar answered Sep 24 '22 05:09

Rohit Luthra