Je me demandais toujours: quelle est la fin d'un flux? p>
Dans la Javadoc de la plupart des méthodes de lecture en lecture dans le paquet Java.io, vous pouvez lire que "cela renvoie null si la fin du flux est atteinte" - bien que je n'ai jamais eu de null, comme la plupart des flux (dans le cas d'un flux de réseau que j'utilise le plus souvent) bloque simplement l'exécution du programme jusqu'à ce que quelque chose soit écrit dans le flux de l'extrémité distante p>
Existe-t-il des moyens d'appliquer ce comportement acutal à se produire d'une manière réelle de lancer une exception? Je suis simplement curieux ... p>
3 Réponses :
Pensez à un fichier en cours de lecture. Il y a une fin de flux là-bas, la fin du fichier. Si vous essayez de lire au-delà de cela, vous ne pouvez tout simplement pas. Si vous avez une connexion réseau cependant, il n'a pas besoin d'être une fin de flux si vous attendez simplement que plus de données soient envoyées. P>
Dans le cas du fichier, nous savons pour un fait qu'il n'y a plus de données à lire. Dans le cas d'un flux de réseau, nous (généralement). P>
Blocage A Une solution de contournement éventuelle serait de créer un wrapper au FileReader CODE> Quand aucune autre donnée n'est disponible, réveil lorsqu'il y a: strong> La réponse simple est la suivante: vous ne pouvez pas em>. La différence fondamentale est que vous lisez activement un fichier, mais lorsque vous écoutez un flux réseau que vous avez lu passivement. Lorsque quelque chose vient du réseau, votre matériel envoie une courte du signal au système d'exploitation, ce qui donne ensuite les nouvelles données à votre JVM et que le JVM est alors éveillé votre processus pour lire les nouvelles données (pour ainsi dire). Mais nous n'avons pas cela avec un fichier, du moins pas immédiatement. P>
StreamReader code> que vous avez, avec un auditeur qui est notifié lorsque le fichier est modifié, ce qui vous réveille ensuite pour lire plus loin. En Java 7, vous pouvez utiliser
Watchservice code>
. P >
J'ai effectivement réussi à obtenir le lecteur de retourner NULL en fermant la prise de l'extrémité distante - évidemment, le flux est résilié, mais un indicateur est configuré pour dire tout ce qui tente de lire à partir de celui-ci (pour recevoir des données). ... C'est le moment où j'ai attendu d'insérer du code de nettoyage lorsque l'extrémité distante ferme la connexion!
Vous pouvez vérifier configureblocking code>
et disponible code>
À un moment donné, la prise sera fermée et plus aucune donnée ne peut être envoyée via ce flux. Ceci est lorsque le Blocage simplement pour plus de données sur un flux ouvert n'est pas une condition EOF. P> InputStream code> signalera EOF en renvoyant -1 à partir de
Lecture () code> et ses surcharges. Cet état est irréversible. Ce flux est mort. P>
Quelle est la différence exacte entre EOF et EOS (Thream)? - une réponse comme "le code-code" est également valide
@salbeira Il n'y a pas de différence et aucune donnée n'est réellement transmise sur le flux (ou lire dans le fichier). Ce résultat est généré par la classe d'implémentation code> introuvream code>. C'est le résultat de la logique, ce n'est pas un signal en bande.
Je n'ai jamais eu de null, comme la plupart des flux (dans le cas d'un flux de réseau que j'utilise le plus souvent), bloquez simplement l'exécution du programme jusqu'à ce que quelque chose soit écrit dans le flux de l'extrémité distante p> blockQuote>
Non. Vous n'avez jamais eu de null parce que la pair n'a jamais fermé la connexion. C'est ce que signifie "fin du flux". Cela ne signifie pas «pas plus de données pour le moment». P>
Lire un fichier avec un fichierInputStream.
Appliquer quel comportement exactement? Vous voulez bloquer le programme jusqu'à ce que quelque chose d'autre soit disponible?
Provoquer un lecteur de retourner NULL lors de la lecture d'un flux réseau avec readline ();