FileStream vs / différences StreamWriter?

85

Question:

Qu'est-ce qui est différent entre FileStreamet StreamWriterdans .Net ?

Dans quel contexte êtes-vous censé l'utiliser? Quel est leur avantage et leur inconvénient?

Est-il possible de combiner ces deux en un seul?

Quoi de neuf
la source

Réponses:

98

Quelle est la différence entre FileStream et StreamWriter dans dotnet?

A FileStreamest un Stream. Comme tous les Streams, il ne traite que des byte[]données.

A StreamWriter : TextWriter, est un décorateur de Stream. Un TextWriter encode les données de texte comme une chaîne ou un caractère byte[], puis les écrit dans le fichier lié Stream.

Dans quel contexte êtes-vous censé l'utiliser? Quel est leur avantage et leur inconvénient?

Vous utilisez un FileStream nu lorsque vous avez des byte[]données. Vous ajoutez un StreamWriterlorsque vous souhaitez écrire du texte. Utilisez un formateur ou un sérialiseur pour écrire des données plus complexes.

Est-il possible de combiner ces deux en un seul?

Oui. Vous avez toujours besoin d'un Stream pour créer un StreamWriter. La méthode d'assistance System.IO.File.CreateText("path")les créera en combinaison et vous n'aurez alors qu'à Dispose () l'écrivain externe.

Henk Holterman
la source
4
Il est également important de noter qu'il FileStreams'agit d'un type de flux, spécifiquement adapté aux fichiers. Les flux fonctionnent nativement avec des octets, cependant StreamWriter/ Reader écrira / lira du texte sur n'importe quel flux, pas seulement FileStreams. Par exemple, MemoryStreams, NetworkStreams, etc ..
iliketocode
19

FileStream écrit des octets, StreamWriter écrit du texte. C'est tout.

Hans Passant
la source
14
En fait, ce n'est pas "tout" ... Mais c'est une différence correcte.
David
14

Un FileStream est explicitement destiné aux fichiers de travail.

Un StreamWriter peut être utilisé pour diffuser vers n'importe quel type de Stream - sockets réseau, fichiers, etc.

ScottGu explique assez bien les différents objets Stream ici: http://www.codeguru.com/Csharp/Csharp/cs_data/streaming/article.php/c4223

David
la source
1
Excellente référence pour les flux, bien qu'elle ne couvre pas les flux R / W à accès aléatoire. En particulier, les informations de sérialisation / désérialisation et la démonstration des flux autres que des fichiers sont très utiles. +1
ThunderGr
7

Eh bien, du MSDN pour FileStream:

Expose un Stream autour d'un fichier, prenant en charge les opérations de lecture et d'écriture synchrones et asynchrones.

et le MSDN pour StreamWriter:

Implémente un TextWriter pour écrire des caractères dans un flux dans un encodage particulier.

La différence la plus évidente est que FileStreampermet les opérations de lecture / écriture, alors que StreamWriterc'est en écriture uniquement.

La StreamWriterpage continue en ajoutant:

StreamWriter est conçu pour la sortie de caractères dans un codage particulier, tandis que les classes dérivées de Stream sont conçues pour l'entrée et la sortie d'octets.

Donc, une deuxième différence est que FileStreamc'est pour les octets, tandis que StreamWriterpour le texte.

ChrisF
la source
6

Il s'agit de deux niveaux différents utilisés pour la sortie d'informations vers des sources de données connues.

A FileStreamest un type de Stream, qui est conceptuellement un mécanisme qui pointe vers un emplacement et peut gérer des données entrantes et / ou sortantes vers et depuis cet emplacement. Il existe des flux pour lire / écrire dans des fichiers, des connexions réseau, de la mémoire, des canaux, la console, des écouteurs de débogage et de trace, et quelques autres types de sources de données. Plus précisément, un FileStreamexiste pour effectuer des lectures et des écritures dans le système de fichiers. La plupart des flux sont assez bas dans leur utilisation et traitent les données sous forme d'octets.

A StreamWriterest un wrapper pour un flux qui simplifie l'utilisation de ce flux pour produire du texte brut. Il expose des méthodes qui prennent des chaînes au lieu d'octets et effectue les conversions nécessaires vers et à partir de tableaux d'octets. Il y a d'autres écrivains; L'autre principal que vous utiliseriez est le XmlTextWriter, qui facilite l'écriture de données au format XML . Il existe également des équivalents Reader aux Writers qui encapsulent de la même manière un Stream et facilitent la récupération des données.

KeithS
la source
0

Une différence clé (en plus des commentaires ci-dessus), pourrait être que FileStream prend en charge l'accès aléatoire au disque en lecture et en écriture dans n'importe quel FileStream.Position spécifié. Pour les modifications de fichiers volumineux, cela peut être inestimable.

haricot
la source