159 votes

Disposant de streamreader ferme le flux ?

J’envoie un flux de données à écrire sur des méthodes, et dans ces méthodes, j’utilise un lecteur binaire/wrtier. Alors que le lecteur/graveur est disposé, soit par `` ou juste au moment où il n’est pas référencé, est le flux fermé ainsi ??

J’enverrais un BinaryReader/écrivain, mais j’utilise aussi un StreamReader (peut-être que je devrais aller autour de cela. Je suis seulement en utilisant que GetLine et ReadLine). C’est assez gênant si on ferme le flux de chaque fois qu'un lecteur/enregistreur est fermé.

198voto

Jon Skeet Points 692016

Oui, StreamReader, StreamWriter, BinaryReader et BinaryWriter toutes proches/départir de leurs sous-jacents flux lorsque vous appelez Dispose . Ils ne pas disposer de la transmission si le lecteur/graveur est juste des ordures collectées cependant, vous devez toujours disposer du lecteur/enregistreur, de préférence avec un using déclaration. (En fait, aucun de ces classes ont des finaliseurs, ils ne devraient pas avoir.)

Personnellement, je préfère avoir une aide de déclaration pour le flux. Vous pouvez imbriquer using des déclarations sans accolades assez facilement:

using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}

Même si l' using déclaration pour le stream est un peu redondante (à moins que l' StreamReader constructeur lève une exception) je considère que c'est la meilleure pratique alors si vous vous débarrassez de l' StreamReader et il suffit d'utiliser le flux directement à une date ultérieure, vous aurez déjà le droit à l'élimination de la sémantique.

42voto

acarlon Points 4636

C'est un ancien, mais je voulais faire quelque chose de semblable aujourd'hui et a trouvé que les choses ont changé. Depuis .net 4.5, il y a un leaveOpen argument:

public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen )

Le seul problème est qu'il n'est pas évident à définir pour les autres paramètres. Voici un peu d'aide:

À partir de la page msdn pour le Constructeur StreamReader (Stream):

Ce constructeur initialise le codage de UTF8Encoding, l' BaseStream propriété en utilisant le paramètre stream, et l'interne taille de la mémoire tampon à 1024 octets.

Cela ne laisse detectEncodingFromByteOrderMarks qui a en juger par le code source est - true

public StreamReader(Stream stream)
        : this(stream, true) {
}

public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)
        : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {
}

Ce serait bien si certains de ces paramètres par défaut ont été exposées, ou si les arguments sont facultatifs, de sorte que nous pourrions simplement préciser à ceux que nous voulons.

29voto

Brian Rasmussen Points 68853

Oui, il le fait. Vous pouvez le vérifier en regardant la mise en œuvre avec réflecteur.

2voto

Joe M Points 230

Oui. L’appel Dispose() sur et IDisposable (qui « utilise » fait) devrait rendre un objet nettoyer de toutes ses ressources. Cela inclut les flux de rinçage et de fermeture de leurs descripteurs de fichiers.

Si, dans votre cas, vous souhaitez passer dans d’autres méthodes, alors vous devez vous assurer que ces méthodes ne font pas leur lecture/écriture dans une utilisation bloc.

1voto

Aaron Murgatroyd Points 857

Un moyen facile de résoudre ce problème si vous devez consiste à substituer la méthode de Dispose de classes StreamWriter. Voir mon post ici pour le code sur la façon de le faire :

Le fait. Jetant un StreamWriter fermer le flux sous-jacent ?

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