2009-09-10 8 views
80

Las corrientes son algo misteriosas para mí. No sé cuándo usar qué transmisión y cómo usarlas. ¿Puede alguien explicarme cómo se usan las secuencias?C# usando transmisiones

Si he entendido bien, hay tres tipos de trenes:

  • stream
  • read stream
  • write stream

Es esto correcto? Y, por ejemplo, ¿cuál es la diferencia entre un Memorystream y un FileStream?

+11

es posible que desee comprobar http://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streams – Preets

+1

Tome una matriz de bytes y luego cree un contenedor para ello ('Stream') que expone algunos métodos útiles, como leer, escribir y cambiar de posición. Ahora puede crear clases basadas en su almacén de respaldo (FileStream, MemoryStream) que heredan de 'Stream' y se basan en esa funcionalidad basada en el almacén de respaldo particular. –

Respuesta

47

A corriente es un objeto usado para transferir datos. Hay una clase de flujo genérico System.IO.Stream, del cual se derivan todas las demás clases de flujo en .NET. La clase Stream se ocupa de los bytes.

Las clases de flujo concretas se utilizan para tratar con otros tipos de datos además de los bytes.Por ejemplo:

  • La clase FileStream se utiliza cuando la fuente externa es un archivo
  • MemoryStream se utiliza para almacenar datos en la memoria
  • System.Net.Sockets.NetworkStream maneja datos de la red

lector/escritor corrientes, como como StreamReader y StreamWriter no son transmisiones, no se derivan de System.IO.Stream, están diseñadas para ayudar a escribir y leer datos de y transmitirlos.

+3

Entonces, si lo entiendo correctamente, la transmisión contiene los datos y no hace nada con ellos. Las clases de 'ayudantes' de lectores y escritores pueden manejar (manipular) los datos dentro de la transmisión. – Martijn

+6

No, Stream no es un contenedor de datos, se usa para transferir datos, por ejemplo, FileStream transfiere datos de byte [] a un archivo phisical, NetworkStream transfiere byte [] por socket. Las clases de Reader Writer son clases de ayuda para escribir y leer de la transmisión, por ejemplo, StreamReader se puede usar para leer de Stream string not byte []. si le da FileStream como parámetro, leerá de File, si es NetworkStream desde el socket. –

+0

Además, StreamReader y StreamWriter son para leer y escribir secuencias de TEXTO (caracteres). – 1c1cle

0

Bueno, en la mayoría de los casos puedes leer y escribir en una secuencia, una secuencia de memoria es algo que puedes declarar para poder trabajar con datos en la memoria y una secuencia de archivos apunta a un archivo, así que cuando usted escribe o lee desde una secuencia de archivos, entonces está leyendo/escribiendo el archivo.

2

Me gustaría empezar por leer sobre corrientes en MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

MemoryStream y FileStream son corrientes que se utilizan para trabajar con la memoria y archivos en bruto, respectivamente ...

+0

Gracias por el enlace. Me encantó eso: "Puedes navegar por el código fuente en línea, descargar la referencia para verlo sin conexión y recorrer las fuentes (incluidos parches y actualizaciones) durante la depuración". Esta característica ofrece un nuevo nivel de conocimiento. – David

3

Sólo hay un tipo básico de Stream . Sin embargo, en diversas circunstancias, algunos miembros lanzarán una excepción cuando se les llame porque en ese contexto la operación no estaba disponible.

Por ejemplo, un MemoryStream es simplemente una forma de mover los bytes dentro y fuera de un pedazo de memoria. Por lo tanto, puede llamar a Leer y Escribir en él.

Por otro lado, una FileStream le permite leer o escribir (o ambos) de/en un archivo. Si realmente puede leer o escribir depende de cómo se abrió el archivo. No puede Escribir en un archivo si solo lo abrió para acceso de Lectura.

1

No llamaría a esos tipos diferentes de transmisiones. La clase Stream tiene propiedades CanRead y CanWrite que le indican si la secuencia concreta puede leerse y escribirse.

La principal diferencia entre las diferentes clases de flujo (como MemoryStream vs FileStream) es la tienda de respaldo, donde se leen los datos o donde se escriben. Es algo obvio por el nombre. Un MemoryStream almacena los datos en la memoria solamente, un FileStream está respaldado por un archivo en el disco, un NetworkStream lee datos de la red, y así sucesivamente.

15

Las transmisiones son buenas para manejar grandes cantidades de datos. Cuando no es práctico cargar todos los datos en la memoria al mismo tiempo, puede abrirlos como una secuencia y trabajar con pequeños fragmentos de la misma.

+0

Me encantaría ver un ejemplo de lo que acaba de decir "trabaje con pequeños trozos". –

+2

Las transmisiones también son buenas para pequeñas cantidades de datos. Si un programador de C# desea manipular el contenido de un archivo, debe usar secuencias, independientemente de la cantidad de datos. La misma afirmación también es válida para los flujos de red. Por supuesto, si el programador está codificando es un lenguaje de nivel inferior como C, entonces es posible escribir caracteres o bytes directamente en un disco o zócalo, pero incluso para una pequeña cantidad de datos, consume mucho tiempo y es más propenso a error. – 1c1cle

40

Para ampliar un poco sobre otras respuestas aquí, y ayudar a explicar gran parte del código de ejemplo que verá salpicado, la mayoría de las veces no lee y escribe directamente en una transmisión. Las transmisiones son un medio de bajo nivel para transferir datos.

Observará que las funciones de lectura y escritura están orientadas por bytes, p. Ej. WriteByte() No hay funciones para tratar enteros, cadenas, etc. Esto hace que la transmisión sea de propósito general, pero menos fácil de usar si, por ejemplo, solo desea transferir texto.

Sin embargo, .NET proporciona clases que convierten entre los tipos nativos y la interfaz de transmisión de bajo nivel, y transfiere los datos ao desde la transmisión por usted. Algunos notables tales clases son:

StreamWriter // Badly named. Should be TextWriter. 
StreamReader // Badly named. Should be TextReader. 
BinaryWriter 
BinaryReader 

Para utilizar estos, en primer lugar se adquiere el torrente, a continuación, crear una de las clases anteriores y asociarlo con la corriente. P.ej.

MemoryStream memoryStream = new MemoryStream(); 
StreamWriter myStreamWriter = new StreamWriter(memoryStream); 

StreamReader y StreamWriter la conversión entre tipos nativos y sus representaciones de cadena luego se transfieren a las cuerdas y de la corriente como bytes. Así

myStreamWriter.Write(123); 

escribirá "123" (tres caracteres '1', '2' y luego '3') a la corriente. Si está tratando con archivos de texto (por ejemplo, html), StreamReader y StreamWriter son las clases que usaría.

Considerando

myBinaryWriter.Write(123); 

va a escribir cuatro bytes que representan el valor entero de 32 bits 123 (0x7B, 0x00, 0x00, 0x00). Si está tratando con archivos binarios o protocolos de red, BinaryReader y BinaryWriter son lo que podría usar. (Si está intercambiando datos con redes u otros sistemas, debe tener en cuenta endianness, pero esa es otra publicación.)

2

La transmisión es solo una abstracción (o un contenedor) sobre una secuencia de bytes physical. Esta corriente physical se llama base stream. Así que siempre hay una corriente de base sobre el que se crea una envoltura de flujo y por lo tanto la envoltura es el nombre de la base de tipo de flujo es decir FileStream, etc. MemoryStream

La ventaja de la envoltura de secuencia es que se obtiene una API unificada para interactuar ríos de cualquier tipo subyacente usb, file etc.

¿por qué el tratamiento de datos mientras que el flujo de - debido a fragmentos de datos se cargan bajo demanda, podemos inspeccionar/proceso de los datos como trozos en lugar de cargar todos los datos en memoria.Así es como la mayoría de los programas tratan con archivos grandes, por ejemplo, encriptando un archivo de imagen del sistema operativo.

Cuestiones relacionadas