Forum Stats

  • 3,839,324 Users
  • 2,262,481 Discussions
  • 7,900,934 Comments

Discussions

Problems using WatchService

961299
961299 Member Posts: 1
edited Sep 11, 2012 1:38PM in Java Desktop Applications
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

Answers

  • morgalr
    morgalr Member Posts: 457
    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.
This discussion has been closed.