c# - new - IO 101: ¿Cuáles son las principales diferencias entre TextWriter, FileStream y StreamWriter?
textwriter to string c# (5)
Hay una diferencia obvia entre "Stream" y "Writer / Reader".
Una secuencia es una representación de nivel de bytes, y es realmente un concepto abstracto que se puede implementar de varias maneras. Por ejemplo, tiene un FileStream y un MemoryStream. Ambas son secuencias de bytes, pero se almacenan de forma diferente.
Los escritores y lectores le dan una forma de procesar flujos, agregar y extraer datos de ellos.
Para sus ejemplos particulares, TextWriter es una clase abstracta que escribe caracteres en una secuencia secuencialmente. Tiene varias implementaciones (StreamWriter, StringWriter) que sí son útiles en diferentes contextos. Utilizarías lo que tenga sentido en ese momento. Para varias API, sin embargo, todo lo que se necesita es un TextWriter, o algo para llamar "Write" o "WriteLine". No es una preocupación de esas API si su escritor se utiliza para poner cosas en una cadena, alguna memoria arbitraria o un archivo.
Permítanme primero disculparme si esta pregunta puede sonar algo amateur para los experimentados programadores entre ustedes, la cosa es que he estado teniendo muchos argumentos sobre esto en el trabajo así que realmente quiero entender esto y eso es básicamente por lo que estoy confiando. en la comunidad de stackoverflow para resolver esto de una vez por todas :)
Entonces, por un lado, según MSDN, tenemos:
Clase TextWriter
Representa a un escritor que puede escribir una serie secuencial de caracteres. Esta clase es abstracta
Clase FileStream
Expone un flujo alrededor de un archivo, admitiendo operaciones de lectura y escritura sincrónicas y asíncronas.
Clase StreamWriter
Implementa un TextWriter para escribir caracteres en una secuencia en una codificación particular.
Por otro lado, es evidente que todos pertenecen a System.IO, pero dado que los ejemplos de MSDN combinan algunos de ellos, todavía no estoy llegando al muy deseado momento de a-ha.
Cualquier comentario sería más que apreciado, ¡muchas gracias de antemano!
La clase FileStream administra la administración de un archivo y su apertura para lectura o escritura y otras funciones del sistema de archivos. BinaryWriter escribe datos binarios en una secuencia y StreamWriter escribe datos de caracteres en una secuencia. Ambos pueden usar un objeto FileStream para escribir datos binarios o de caracteres en los archivos.
TextWriter es la clase base de la que StreamWriter hereda. Un TextWriter está destinado a tomar un tipo y dar salida a una cadena utilizando su método TextWriter . La implementación de StreamWriter del método TextWriter.Write escribe una cadena o datos de caracteres en una secuencia. BinaryWriter no hereda TextWriter porque no escribe datos de caracteres en una secuencia.
Las secuencias manejan los bytes , los escritores manejan los caracteres .
Bytes! = Caracteres. Un personaje puede tomar más de un byte para representar. La asignación de caracteres a bytes se llama codificación .
Un FileStream
refiere a los bytes que se escriben en un archivo, similar a cómo un MemoryStream
refiere a los bytes escritos en un búfer en memoria. Para escribir caracteres en una secuencia, necesitarás convertirlos a una cadena de bytes. Ahí es donde StreamWriter
un StreamWriter
para jugar. Toma una secuencia de caracteres y una codificación, y lo convierte en una secuencia de bytes.
Un TextWriter
es una interfaz (bien, clase base abstracta) que todos los Escritores deben cumplir. Tiene todas las operaciones basadas en personajes. El equivalente para bytes es la clase base abstracta Stream
.
Las cosas también van en la dirección opuesta. Hay una clase base abstracta de TextReader
, que describe cómo leer caracteres de algún lugar, y un StreamReader
, que le permite leer caracteres de una secuencia orientada a bytes que proporciona una codificación, pero esta vez se usa en reversa para agregar secuencias multibyte. en caracteres individuales cuando corresponda.
Una Stream
se puede usar tanto para lectura como para escritura, ya que los bytes son los elementos de nivel más bajo utilizados en las operaciones de E / S.
Siempre he pensado que lo mejor es observar qué métodos ofrecen y cómo pueden crearlos. Esto es casi siempre lo principal, si no solo, que me importa cuando uso una API. ¿Cómo lo construyo y qué puede hacer?
No puedes instanciar un TextWriter. Es abstracto Eso me dice que el único propósito real al que sirve es, bueno, la abstracción. Si escribe una función que tome como argumento a cualquier tipo de escritor, hay buenas posibilidades de que simplemente tome TextWriter para ser más versátil.
Un StreamWriter que puede crear instancias, y hace exactamente lo que dice, escribe en las transmisiones. Eso significa que necesitará una secuencia para hacer cualquier escritura real. Sin embargo, una vez que tenga esa secuencia, podrá hacer todo tipo de cosas ordenadas, como escribir una línea completa a la vez, en lugar de tener que tratar con caracteres individuales (o más bien bytes) como lo haría directamente en la transmisión.
Entonces, básicamente, obtienes un flujo para que puedas alimentarlo a un StreamWriter (o Reader). Si está escribiendo texto, probablemente no desee trabajar directamente con una transmisión, no más de lo que desea trabajar con una matriz de caracteres en lugar de una cadena.
FileStreams se puede instanciar convenientemente directamente desde las clases File y FileInfo, y en mi uso, así es como suelen crearse instancias. Obtenga un archivo (me gusta usar FileInfo) y llame a OpenWrite (). Pásalo a StreamWriter (que es solo un tipo de TextWriter) y estarás en camino.
Para generalizar: cuando desee averiguar una clase, intente ver cómo la instancia y qué puede hacer. Esto generalmente aclara mucho.
Stream
es una clase base abstracta que representa una serie de bytes.
MemoryStream
es una secuencia de bytes almacenados en la memoria, respaldados por una matriz.FileStream
es una secuencia de bytes en un archivo, generalmente respaldada por un identificador de archivo en algún lugar del disco.
Los caracteres de texto están compuestos de bytes, y un solo carácter puede tener múltiples bytes, dependiendo de la codificación. Hay algunas clases básicas que leen y escriben texto en diferentes fuentes con una codificación establecida.
TextWriter
es una clase base abstracta para escribir caracteres de texto en un destino.
-
StreamWriter
escribe caracteres de texto (convertidos en bytes) en una secuencia de bytes. -
StringWriter
escribe caracteres de texto en una cadena (a través de un StringBuilder).
TextReader
es una clase base abstracta para leer caracteres de texto de una fuente.
-
StreamReader
lee caracteres de texto (convertidos desde bytes) de una secuencia de bytes. -
StringReader
lee caracteres de texto de una cadena.
Stream
, TextWriter
, TextReader
son todas las clases base abstractas, por lo que nunca se usan directamente, sino a través de una implementación como las descritas anteriormente. Sin embargo, verá las clases base en las definiciones de métodos para que se puedan usar diferentes implementaciones, incluidas las personalizadas, si es necesario. Las clases abstractas son similares a las interfaces, pero en realidad pueden definir la lógica para los métodos, que pueden reutilizarse sin que cada implementación repita el mismo código básico.