IO 101: Quelles sont les principales différences entre TextWriter, FileStream et StreamWriter?

StackOverflow https://stackoverflow.com/questions/1010555

  •  06-07-2019
  •  | 
  •  

Question

Permettez-moi de commencer par m'excuser si cette question peut sembler un peu amateure pour les programmeurs chevronnés parmi vous. Le problème, c'est que j'ai eu de nombreux arguments à ce sujet au travail, donc je veux vraiment que ce soit clair et c'est pourquoi je Je compte sur la communauté stackoverflow pour résoudre ce problème une fois pour toutes:)

Donc, d’une part, selon MSDN, nous avons:

  

Classe TextWriter

     

Représente un écrivain pouvant écrire un   série séquentielle de caractères. Ce   la classe est abstraite.

     

Classe FileStream

     

expose un flux autour d'un fichier,   supportant à la fois synchrone et   lecture et écriture asynchrones   opérations.

     

Classe StreamWriter

     

Implémente un TextWriter pour l'écriture   caractères à un flux dans un particulier   encodage.

D'un autre côté, il est évident qu'ils appartiennent tous à System.IO, mais étant donné que les exemples MSDN en mélangent en partie, je n'ai pas encore atteint le moment tant attendu.

Tout commentaire serait plus qu'apprécié, merci beaucoup d'avance!

Était-ce utile?

La solution

Les flux traitent les octets , les rédacteurs gèrent les caractères .

Octets! = caractères. Un personnage peut prendre plus d'un octet à représenter. Le mappage de caractères en octets est appelé un encoding .

Un FileStream fait référence aux octets en cours d'écriture dans un fichier, de la même manière qu'un MemoryStream fait référence aux octets écrits dans un tampon en mémoire. Pour écrire des caractères dans un flux, vous devez les convertir en chaîne d'octets. C'est là qu'un StreamWriter entre en jeu. Il prend une séquence de caractères et un encodage, et le transforme en une séquence d'octets.

Un TextWriter est une interface (bien, une classe de base abstraite) à laquelle tous les rédacteurs doivent adhérer. Il a toutes les opérations basées sur les caractères. L'équivalent pour les octets est la classe de base abstraite Stream .

Les choses vont aussi dans la direction opposée. Il existe une classe de base abstraite TextReader , décrivant comment lire des caractères quelque part, et un StreamReader , qui vous permet de lire des caractères à partir d'un flux orienté octet fournissant un codage - mais cette fois-ci utilisé en sens inverse, pour agréger toute séquence multi-octets en caractères uniques, le cas échéant.

Un Stream peut être utilisé en lecture et en écriture, car les octets sont les éléments de plus bas niveau utilisés dans les opérations d'E / S.

Autres conseils

J'ai toujours trouvé que la meilleure chose à faire était de simplement regarder quelles méthodes elles proposent et comment les construire. C’est presque toujours la chose principale, sinon la seule, qui me tient à coeur lors de l’utilisation d’une API. Comment puis-je le construire et que peut-il faire?

Vous ne pouvez pas instancier un TextWriter. C'est abstrait. Cela me dit que le seul but réel que cela serve est, eh bien, l'abstraction. Si vous écrivez une fonction qui prend n'importe quel type d’écrivain comme argument, il y a de bonnes chances que vous preniez TextWriter pour être plus polyvalent.

Un StreamWriter que vous pouvez instancier, et il fait exactement ce qu'il dit, il écrit dans les flux. Cela signifie qu'il faudra un flux pour que toute écriture réelle soit faite. Une fois que vous avez ce flux, vous pouvez faire toutes sortes de choses intéressantes comme écrire une ligne entière à la fois au lieu de devoir traiter des caractères individuels (ou plutôt des octets) comme vous le feriez directement sur le flux.

Donc, en gros, vous obtenez un flux afin que vous puissiez le transmettre à un StreamWriter (ou à un Reader). Si vous écrivez du texte, vous ne voudrez probablement pas travailler directement avec un flux, pas plus que vous ne voulez travailler avec un tableau de caractères au lieu d'une chaîne.

Les flux de fichiers peuvent facilement être instanciés directement à partir des classes File et FileInfo. Dans mon utilisation, voici comment ils sont généralement instanciés. Obtenez un fichier (j'aime utiliser FileInfo) et appelez OpenWrite (). Transmettez-le à un StreamWriter (qui est juste un type de TextWriter) et vous êtes sur votre chemin.

Pour généraliser: quand vous voulez comprendre une classe, essayez de voir comment vous l’instanciez et ce qu’elle peut faire. Cela éclaircit généralement beaucoup.

Il existe une différence évidente entre un " Stream " et un "Writer / Reader".

Un flux est une représentation au niveau octet. Il s'agit en réalité d'un concept abstrait pouvant être mis en œuvre de différentes manières. Par exemple, vous avez un FileStream et un MemoryStream. Ce sont deux flux d'octets, mais ils sont stockés différemment.

Les rédacteurs et les lecteurs vous permettent de traiter les flux, d’ajouter et d’en extraire des données.

Pour vos exemples particuliers, TextWriter est une classe abstraite qui écrit des caractères dans un flux de manière séquentielle. Il a plusieurs implémentations (StreamWriter, StringWriter) qui sont utiles dans différents contextes. Vous utiliseriez ce qui est logique à l'époque. Cependant, pour plusieurs API, il suffit d'un TextWriter ou de quelque chose à appeler "Write". ou " WriteLine " sur. Si ces rédacteurs sont utilisés pour insérer des éléments dans une chaîne, de la mémoire arbitraire ou un fichier, le problème ne concerne pas ces API.

La classe FileStream gère la gestion d'un descripteur. dans un fichier et en l'ouvrant pour la lecture ou l'écriture et d'autres fonctions du système de fichiers. BinaryWriter écrit des données binaires dans un flux et StreamWriter écrit les données de caractères dans un flux. Ils peuvent tous les deux utiliser un objet FileStream pour écrire des données binaires ou caractères dans des fichiers.

TextWriter est la classe de base dont StreamWriter hérite. Un TextWriter est destiné à prendre un type et générer une chaîne en utilisant sa méthode Write . L'implémentation de la méthode TextWriter.Write par StreamWriter écrit une chaîne, ou des données de caractères, dans un flux. BinaryWriter n'hérite pas de TextWriter car il n'écrit pas de données de caractères dans un flux.

Stream est une classe de base abstraite qui représente une série d'octets.

  • MemoryStream est un flux d'octets conservés en mémoire, sauvegardés par un tableau.

  • FileStream est un flux d'octets dans un fichier, généralement sauvegardé par un descripteur de fichier quelque part sur le disque.

Les caractères de texte sont eux-mêmes composés d'octets et un seul caractère peut être composé de plusieurs octets, en fonction du codage. Certaines classes standard lisent et écrivent du texte dans différentes sources en utilisant un codage spécifique.

TextWriter est une classe de base abstraite permettant d'écrire des caractères de texte dans une destination.

  • StreamWriter écrit des caractères de texte (convertis en octets) dans un flux d'octets.
  • StringWriter écrit des caractères de texte dans une chaîne (via un constructeur de chaînes).

TextReader est une classe de base abstraite permettant de lire des caractères de texte à partir d'une source.

  • StreamReader lit les caractères de texte (convertis d'octets) à partir d'un flux d'octets.
  • StringReader lit les caractères de texte d'une chaîne.

Stream , TextWriter , TextReader sont toutes des classes de base abstraites. Elles ne sont donc jamais utilisées directement, mais par le biais d'une implémentation comme celles décrites ci-dessus. Cependant, vous verrez les classes de base dans les définitions de méthodes afin que différentes implémentations puissent être utilisées, y compris vos propres personnalisations, si nécessaire. Les classes abstraites sont similaires aux interfaces, mais peuvent en réalité définir la logique des méthodes, qui peuvent être réutilisées sans que chaque implémentation répète le même code de base.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top