This discussion is archived
1 Reply Latest reply: Sep 11, 2012 10:38 AM by morgalr RSS

Problems using WatchService

961299 Newbie
Currently Being Moderated
Hello everyone,

I've got a few problems using WatchService.class:

public void watch() throws IOException, InterruptedException{
     WatchService watchService = FileSystems.getDefault().newWatchService();

     Paths.get(desktopDirPath).register(watchService,
               StandardWatchEventKinds.ENTRY_CREATE,
               StandardWatchEventKinds.ENTRY_DELETE,
               StandardWatchEventKinds.ENTRY_MODIFY);
          
     while(true){
          WatchKey key = watchService.take();
               
          for(WatchEvent<?> event : key.pollEvents()){
               WatchEvent.Kind<?> kind = event.kind();
                    
               switch(kind.name()){
                    case KIND_ENTRY_CREATE:
                         // ... do something
                         break;
                         // ... more cases ...
                    default:
                         break;
               }
          }
          key.reset();
     }
}

So, there is my code snippet. First things first:

1.) Is a new thread started automatically when calling watchService's call method? I've been wondering because the method throws an InterruptedException.
2.) I've got problems dealing with the watch events. For example let's imagine we want to move or delete one or more files when created in a specified directory. It seems to work for one file or even a few more. But it fails to handle new files which are created rapidly for example by a service in the watched directory. It seems that the occurring events aren't recognized fast enough, but that's just my theory. I've tried logging the paths to the files in a hashtable and deleting them asynchronous in another thread but it seems that I'll have to deal with concurrency then, won't I?

Best regards!

Edited by: 958296 on 11.09.2012 01:28
  • 1. Re: Problems using WatchService
    morgalr Explorer
    Currently Being Moderated
    958296 wrote:
    Hello everyone,

    I've got a few problems using WatchService.class:

    public void watch() throws IOException, InterruptedException{
         WatchService watchService = FileSystems.getDefault().newWatchService();

         Paths.get(desktopDirPath).register(watchService,
                   StandardWatchEventKinds.ENTRY_CREATE,
                   StandardWatchEventKinds.ENTRY_DELETE,
                   StandardWatchEventKinds.ENTRY_MODIFY);
              
         while(true){
              WatchKey key = watchService.take();
                   
              for(WatchEvent<?> event : key.pollEvents()){
                   WatchEvent.Kind<?> kind = event.kind();
                        
                   switch(kind.name()){
                        case KIND_ENTRY_CREATE:
                             // ... do something
                             break;
                             // ... more cases ...
                        default:
                             break;
                   }
              }
              key.reset();
         }
    }

    So, there is my code snippet. First things first:

    1.) Is a new thread started automatically when calling watchService's call method? I've been wondering because the method throws an InterruptedException.
    Without actually checking the implementation, my understanding is that you have a thread created for he WatchService.
    2.) I've got problems dealing with the watch events. For example let's imagine we want to move or delete one or more files when created in a specified directory. It seems to work for one file or even a few more. But it fails to handle new files which are created rapidly for example by a service in the watched directory. It seems that the occurring events aren't recognized fast enough, but that's just my theory. I've tried logging the paths to the files in a hashtable and deleting them asynchronous in another thread but it seems that I'll have to deal with concurrency then, won't I?
    Yes. As stated in the WatchService Doc, actual functionality of the WatchService is highly platfom implementation specific, and the problem you list is one listed. Any time you have a file that may be visible by others, you have to deal with a potential concurrency issue.

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points