J'étais un peu surpris que le service de surveillance soit mis en œuvre comme processus / thread avec une boucle de vote. Je ne me souviens pas d'une autre API en Java qui est censé le faire. P>
ne serait-il pas beaucoup mieux de le mettre en œuvre comme un ensemble de rappels (auditeurs, observateurs, etc.)? P>
BTW - Y a-t-il une bibliothèque tierce partie qui fait à peu près la même chose, mais utilise le modèle de rappel? p>
3 Réponses :
Apache Commons a quelques services de surveillance de fichier que je pense est beaucoup mieux que ceux de Java 7. im Je ne sais pas s'ils utilisent des rappels, mais ils sont beaucoup plus intuitifs à mon avis. p>
Et oui, je pense qu'un modèle d'observateur serait beaucoup mieux. J'ai lu quelque part que c'est un peu plus dur de le faire avec Java, car il traverse une machine virtuelle et obtenir des fichiers auditeurs que vous devez parler directement au système d'exploitation. Je ne suis pas sûr des détails ou de la validité de cela. p>
Vous faites référence à
Vous n'avez pas à utiliser le sondage, vous pouvez utiliser Watchservice.take (), qui retourne immédiatement lorsqu'un changement se produit. Oui, il nécessite un fil, mais un seul thread peut être utilisé pour que plusieurs objets soient surveillés. Il est donc facile d'implémenter un singleton qui possède un fil d'observation et permet d'enregistrer des rappels pour chaque objet. P>
Quant aux bibliothèques tierces, regardez GUAVA EventBus . Je n'ai pas essayé et je ne suis pas sûr que si cela correspond à vos besoins. P>
Ce n'est pas ce que Watchservice.take () fait. Il retourne une watchkey, pas un regardant. Jusqu'ici assez, dans mon test sur Linux, après la première modification que j'ai causée sur le système de fichiers, elle a renvoyé le même watchKey que sur path.register (...) à nouveau.
"Modifier": Je vous concède. Voir ma réponse pour plus de détails.
Je construit sur Alexeis Réponse, mais je ne pense pas qu'il était assez clair ... Regardez cet exemple de code: si vous vérifiez le Le println (clé) code> / printLn (k) code> sorties, vous verrez que le même objet est renvoyé et plus; Prendre () Code> Retours Chaque fois que la touche est signalée, afin d'utiliser plusieurs touches avec le même code> watchservice code>, vérifiez simplement quelle clé a été renvoyée à chaque fois. Cela signifie également que votre boucle bloque tant que la clé n'a pas été signalée - exactement ce que vous voulez. P> si (! K.ReSet ()). Code> est crucial. ; C'est ce que j'ai oublié quand j'écris mon commentaire sur Alexeis Répondre. Mon hypothèse était que prise () code> est appelé par registre () code>, et donc aucune touche ne doit être renvoyée dans mon code d'utilisateur, car registre () l'a déjà consommée. Avec cette mauvaise hypothèse, je n'ai pas reconnu ce qui se passait réellement. P> p>
Je ne comprends pas le problème ici. Même avec le modèle de rappel, vous devez obtenir les événements de quelque part i>. Un autre fil, fondamentalement, qui fait le rappel pour vous. Vous pouvez envisager un
watchservice code> comme un "appelant de rappel" ...FGE: Si vous regardez dans la hiérarchie de la classe Watchservice, vous verrez que seul le Sondage généralWatchService utilise un mécanisme naïf occupé sous la hotte. Les autres services de surveillance s'appuient sur des fonctionnalités du système d'exploitation qui capturent les événements plus efficacement - probablement aussi efficaces qu'attendre les octets envoyés à un flux. La manière dont l'API de Watch Service est conçue, la prestation est à nouveau supprimée lorsque l'application tente de recevoir les événements de la watchKey, car il n'ya pas de blocking WayPorevent () ou similaire. Il y a une énorme différence entre un ralenti et un fil de fond occupé.
"Modifier": voir ma réponse pour une approche non chargée qui fonctionne. Néanmoins, la voie expliquée dans les tutoriels Java docs.oracle.com/javase /Tutorial/essential/oNotification.ht ml est un ...