Que fait InputStream.available()
dans Java? J'ai lu la documentation, mais je n'arrive toujours pas à la distinguer.
Le doc dit:
Renvoie le nombre d'octets pouvant être lus (ou ignorés) à partir de ce flux d'entrée sans blocage par l'appelant suivant d'une méthode pour ce flux d'entrée. L'appelant suivant peut être le même thread ou ou un autre thread.
La méthode disponible pour la classe InputStream renvoie toujours 0.
Que veulent-ils dire par blocage? Cela signifie-t-il simplement un appel synchronisé?
Et surtout, quel est le but de la méthode available()
?
Le blocage n'a rien à voir avec le filetage ou la synchronisation ici. Au lieu de cela, il concerne le blocage IO (voir this pour plus d'informations). Si vous émettez une demande de lecture et que le canal n'en a pas de disponible, un appel de blocage attendra (ou bloquer) jusqu'à ce que les données soient disponibles (ou que le canal soit fermé, lève une exception, etc.)
Alors pourquoi utiliser available()
? Ainsi, vous pouvez déterminer le nombre d'octets à lire ou déterminer si vous allez bloquer.
Notez que Java a des capacités non bloquantes IO également. Voir ici pour plus de détails)
Dans InputStreams, les appels read()
sont appelés "méthode de blocage". Cela signifie que si aucune donnée n'est disponible au moment de l'appel de méthode, la méthode attendra que les données soient disponibles.
La méthode available()
vous indique combien d'octets peuvent être lus jusqu'à ce que l'appel read()
bloque le flux d'exécution de votre programme. Sur la plupart des flux d'entrée, tous les appels à read()
sont bloquants, c'est pourquoi available renvoie 0 par défaut.
Cependant, sur certains flux (tels que BufferedInputStream
, qui ont un tampon interne), certains octets sont lus et conservés en mémoire, vous pouvez donc les lire sans bloquer le flux du programme. Dans ce cas, la méthode available()
vous indique combien d'octets sont conservés dans le tampon.