11
votes

Flux d'entrée / sortie: fin du flux?

Je me demandais toujours: quelle est la fin d'un flux?

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

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 ...


3 commentaires

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 ();


3 Réponses :


12
votes

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.

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).

Blocage A FileReader Quand aucune autre donnée n'est disponible, réveil lorsqu'il y a: La réponse simple est la suivante: vous ne pouvez pas . 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.

Une solution de contournement éventuelle serait de créer un wrapper au StreamReader 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 .


2 commentaires

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 et disponible



3
votes

À 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 InputStream signalera EOF en renvoyant -1 à partir de Lecture () et ses surcharges. Cet état est irréversible. Ce flux est mort.

Blocage simplement pour plus de données sur un flux ouvert n'est pas une condition EOF.


2 commentaires

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 introuvream . C'est le résultat de la logique, ce n'est pas un signal en bande.



2
votes

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

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».


0 commentaires