La javadoc pour StandardWatchEventKinds.ENTRY_MODIFY
dit :
Modification de l'entrée du répertoire. Lorsqu'un répertoire est enregistré pour cet événement, le WatchKey est mis en file d'attente lorsqu'il est constaté qu'une entrée dans le l'annuaire a été modifiée. Le nombre d'événements pour cet événement est de 1 ou plus.
Lorsque vous modifiez le contenu d'un fichier par le biais d'un éditeur, celui-ci modifie à la fois la date (ou d'autres métadonnées) et le contenu. Vous obtenez donc deux ENTRY_MODIFY
mais chacun aura un count
de 1 (du moins, c'est ce que je vois).
J'essaie de surveiller un fichier de configuration ( servers.cfg
préalablement enregistré auprès de l WatchService
) qui est mis à jour manuellement (c'est-à-dire par la ligne de commande vi
) avec le code suivant :
while(true) {
watchKey = watchService.take(); // blocks
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
WatchEvent.Kind<Path> kind = watchEvent.kind();
System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind());
// prints (loop on the while twice)
// servers.cfg, count: 1, event: ENTRY_MODIFY
// servers.cfg, count: 1, event: ENTRY_MODIFY
switch(kind.name()) {
case "ENTRY_MODIFY":
handleModify(watchEvent.context()); // reload configuration class
break;
case "ENTRY_DELETE":
handleDelete(watchEvent.context()); // do something else
break;
}
}
watchKey.reset();
}
Puisque vous avez deux ENTRY_MODIFY
les événements ci-dessus rechargeraient deux fois la configuration alors qu'une seule fois est nécessaire. Existe-t-il un moyen d'ignorer tous ces événements sauf un, en supposant qu'il puisse y en avoir plusieurs ?
Si le WatchService
Si l'API dispose d'une telle utilité, c'est tant mieux. (Je n'ai pas vraiment envie de vérifier les temps entre chaque événement. Toutes les méthodes du gestionnaire dans mon code sont synchrones.
La même chose se produit si vous créez (copier/coller) un fichier d'un répertoire vers le répertoire surveillé. Comment pouvez-vous combiner ces deux événements en un seul ?