56 votes

Que fait InputStream.available () en Java?

Qu'est - InputStream.available() le faire en Java? J'ai lu la documentation, mais je ne peux toujours pas le faire sortir.

Le doc a dit:

Renvoie le nombre d'octets qui peut être lu (ou ignorée) à partir de ce flux d'entrée sans blocage par l'appelant suivant d'une méthode de ce flux d'entrée. Le prochain interlocuteur pourrait être le même thread ou un autre thread.

La méthode de la classe InputStream retourne toujours 0.

Que veulent-ils dire par le blocage? C'est juste qu'il signifie en parallèle, un appel?

Et surtout, quel est le but de l' available() méthode?

41voto

Vivien Barousse Points 11435

Dans InputStreams, read() des appels sont dit "blocage" des appels de méthode. Cela signifie que si aucune donnée n'est disponible au moment de l'appel de méthode, la méthode va attendre que les données soient disponibles.

L' available() méthode vous indique le nombre d'octets peut être lu jusqu'à la read() appel va bloquer le flux d'exécution de votre programme. Sur la plupart des flux d'entrée, tous les appels d' read() sont de blocage, c'est pourquoi la disposition renvoie la valeur 0 par défaut.

Cependant, sur certains cours d'eau (comme BufferedInputStream, qui ont une mémoire tampon interne), quelques octets sont lus et conservés en mémoire, de sorte que vous pouvez les lire sans bloquer le flux du programme. Dans ce cas, l' available() méthode vous indique combien d'octets sont conservés dans la mémoire tampon.

30voto

Brian Agnew Points 143181

Le blocage ne concerne pas le filetage ou la synchronisation des ici. Au lieu de cela il se rapporte à un blocage IO (voir ce pour plus d'info). Si vous émettez une demande de lecture de 4 octets, et la chaîne n'a plus que 3 disponibles, un blocage de l'appel d'attendre (ou bloc) jusqu'à ce que le 4ème octet a tourné vers le haut (ou le canal est fermé, déclenche une exception etc.)

Alors pourquoi utiliser available() ? De sorte que vous pouvez déterminer combien d'octets à lire, ou de déterminer si vous allez à bloquer.

Notez que Java est non-bloquant IO capacités. Voir ici pour plus de détails

-2voto

bob Points 1

Demandez-vous si vous écrivez un logiciel TRÈS MAL.. et vous écrire un système d'exploitation.

Ce système d'exploitation prend en entrée de clavier, entre autres choses.

Donc, vous demandez votre OS pour aller chercher de l'entrée au clavier, mais il n'y a pas les touches pressées, et aucun dans le tampon. l'Ensemble de votre système d'exploitation, puis ACCROCHEZ le MORT jusqu'à ce qu'il obtient une saisie au clavier.

Cela contraste avec "look ahead", vous vous demandez si le KO a tous les caractères AVANT de faire l'appel. Vous obtenez la réponse NON, de sorte que votre système d'exploitation, puis s'en va et fait quelque chose d'autre.

C'est POURQUOI vous devriez faire attention, maintenant, si vous multipliez cela par tous les autres potentiellement bloquant la tâche, vous pouvez voir pourquoi "look ahead" est essentiel.

Parce qu'Il s'applique également à la SORTIE: UN mémoire sur un lecteur de disque interface peut également déluge de données pour le lecteur de disque plus rapide qu'il peut traiter. si vous ne connaissez pas le lecteur de la mémoire tampon est inondé avec des données, la tâche sera bloqué jusqu'à ce que la mémoire tampon peut accepter plus de données.

Cela met également en évidence le non-sens de 'il y a très peu d'utiles applications."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X