Selon la documentation API Java, la méthode [read()
](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/InputStream.html#read()) déclarée dans InputStream
est décrite comme suit :
Si aucun octet n'est disponible car la fin du flux a été atteinte, la valeur -1 est renvoyée. Cette méthode bloque jusqu'à ce que des données d'entrée soient disponibles, que la fin du flux soit détectée ou qu'une exception soit levée.
J'ai une boucle while(true)
exécutant un read()
et j'obtiens toujours -1 lorsque rien n'est envoyé sur le flux. C'est attendu.
Ma question est la suivante : quand read()
bloquerait-il ? Puisque s'il ne reçoit aucune donnée, il renvoie -1. Je m'attendrais à ce qu'un read()
bloquant attende l'arrivée de données. Si vous avez atteint la fin du flux d'entrée, read()
ne devrait-il pas simplement attendre les données au lieu de renvoyer -1 ?
Ou est-ce que read()
bloque uniquement s'il y a un autre thread accédant au flux et que votre read()
ne peut pas y accéder ?
Cela m'amène à ma question suivante. J'avais autrefois un gestionnaire d'événements (fourni par ma bibliothèque) qui me notifierait quand des données sont disponibles. Lorsque j'étais notifié, je commençais un cycle while((aByte = read()) > -1)
pour stocker l'octet. J'étais perplexe lorsque j'obtenais DEUX événements en très peu de temps et que toutes mes données n'étaient pas affichées. Il semblait que seule la fin de la seconde événement serait affichée et le reste manquait.
J'ai finalement modifié mon code pour que lorsque je reçois un événement, je commence if(inputStream.available() > 0) while((aByte = read()) > -1)
pour stocker l'octet. Maintenant, cela fonctionnait correctement et toutes mes données étaient affichées.
Quelqu'un pourrait-il expliquer ce comportement ? La méthode [available()
](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/InputStream.html#available()) d'InputStream
est censée renvoyer le nombre d'octets que vous pouvez lire avant de bloquer le prochain appelant (du flux ?). Même si je n'utilise pas available()
, je m'attendrais à ce que la lecture du premier événement bloque simplement la lecture du second événement, mais n'efface pas ou ne consomme pas trop de données du flux. Pourquoi cela causerait-il l'affichage incomplet de mes données ?