11
votes

Endofstream pour BinaryReader

BinaryReader n'a pas de propriété endofstream. Est-il sûr d'utiliser le code suivant pour vérifier si la fin du flux est atteinte?

lecteur.basestream.length> lave.basestream.position


1 commentaires

Quel genre de flux? Tous les flux ne connaissent pas leur longueur à l'avant.


5 Réponses :


3
votes

Cela ne fonctionnera pas comme solution générale car il suppose que la valeur basestreeam prend en charge la propriété longueur . Beaucoup La mise en œuvre ne jettent pas et jette un notsupportedexception . En particulier tout flux de base de réseau, tel que httpeffestetream et NetworkStream


0 commentaires

7
votes

Cela dépend. Il existe différents types de flux qui ne mettent pas en œuvre la propriété ou la propriété de position, vous obtiendrez une notaupportedexception. Networkstream par exemple. Bien sûr, si vous utilisiez un tel flux, vous devez vraiment savoir à l'avance à quelle fréquence appelez la méthode BinaryReader.Read (). Donc, oui, ça va.


2 commentaires

Ce n'est pas universel ... il pourrait y avoir une situation lorsque vous devez lire à la fin d'une réseau de réseau (ce qui se produit lorsque l'autre côté ferme la connexion).


L'attente est que l'autre partie dit bien. Si ce n'est pas alors l'exception que vous obtenez lorsque vous continuez à lire à partir d'une connexion fermée, c'est certainement universel.



10
votes

La manière la plus simple que j'ai trouvée est de vérifier la valeur renvoyée de la méthode PEEKCHAR () de BinaryReader. S'il renvoie -1, vous avez atteint la fin du flux.


3 commentaires

Cela fonctionne que si le flux sous-jacent ne prend pas en charge la recherche.


Oui, j'ai également découvert que dans la pratique, si vous appelez «Peekchar ()» souvent, il peut être extrêmement lent lorsque vous traitez avec des fichiers.


De plus, il semble jeter une exception si les données à cette position se trouvent être un caractère invalide. Je reçois parfois ceci: System.ArgumentException: la mémoire tampon de caractères de sortie est trop petite pour contenir les caractères décodés, codez sur 'Unicode (UTF-8)' "System.Text.DecoderRePlacementCydallback".



1
votes

J'ai remarqué que la comparaison de la position à la longueur ne fonctionne pas sur le rationadateur, même si les basesSeStream sous-jacents à la recherche de la recherche. Il semble que les tampons de diffamation de diffamation à la lecture de la base de base. Cela doit être pourquoi le StreamReader fournit une propriété endoftstream, qui est une bonne chose, et je souhaite que BinaryReader ait fait la même chose.

Vérification de ces valeurs (longueur et position) sur le flux de base sous-jacent sur BinaryReader pour ne pas se comporter comme StreamReader, c'est-à-dire que le BinaryReader ne saisit que le nombre exact d'octets de base nécessaire pour accomplir un appel de méthode utilisateur. Vraisemblablement si BinaryReader a en fait opté de cette façon, c'est pourquoi il n'a pas besoin de fournir une endofstream, mais j'aimerais bien qu'elle ait fourni une pour que je sache que la fin du dossier était correctement traitée pour les clients de manière indépendante. < / p>

Bien sûr, les lecteurs ne sont pas des flux, mais en ce qui concerne la fin du comportement du fichier, il serait agréable s'il y avait une interface commune qui permettait aux clients des classes de saisie / de sortie de savoir si A. Fin du fichier est un concept sensible pour la Source sous-jacente des données, et B. Lorsque la fin du fichier se produit si A est sensible.


0 commentaires

0
votes

Vérifiez la propriété CANSEEK WELS. Si cette propriété renvoie true, vous pouvez comparer la longueur des flux à la position de la diffusion pour indiquer si vous êtes à la fin du flux. Si cette propriété retourne faux, cela ne fonctionnera pas.

Pour les flux de réseau, vous devrez peut-être distinguer entre la fin des octets disponibles (le client de l'autre extrémité a encore plus d'écrire mais n'a pas encore) et le flux étant fermé. La propriété isconnecte pour une connexion TCP sous-jacente n'est pas fiable pour savoir lorsque le flux est fermé. Il est possible d'énumérer les connexions que l'ordinateur a et voyez si le flux que vous utilisez est parmi eux. Ceci est plus fiable, mais plus complexe. Il est peut-être préférable de simplement gérer IoExceptions lorsque vous ne pouvez lire aucun


0 commentaires