Pregunta

Las corrientes son un poco misteriosas para mí. No sé cuándo usar qué flujo y cómo usarlos. ¿Alguien puede explicarme cómo se usan las transmisiones?

Si entiendo correctamente, hay tres tipos de flujo:

  • stream
  • read stream
  • flujo de escritura

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

¿Fue útil?

Solución

Un flujo es un objeto utilizado para transferir datos. Existe una clase de transmisión genérica System.IO.Stream , de la que se derivan todas las demás clases de transmisión en .NET. La clase Stream se ocupa de los bytes.

Las clases de flujo concretas se utilizan para tratar otros tipos de datos que los bytes. Por ejemplo:

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

Reader / writer como StreamReader y StreamWriter no son transmisiones, no se derivan de System.IO.Stream , son ¡Diseñado para ayudar a escribir y leer datos desde y para transmitir!

Otros consejos

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

Observará que todas las funciones para leer y escribir están orientadas a bytes, por ejemplo, WriteByte (). No hay funciones para tratar con enteros, cadenas, etc. Esto hace que el flujo sea muy general, pero menos fácil de trabajar si, por ejemplo, solo desea transferir texto.

Sin embargo, .NET proporciona clases que se convierten entre tipos nativos y la interfaz de flujo de bajo nivel, y transfiere los datos hacia o desde el flujo para usted. Algunas clases notables son:

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

Para usar estos, primero adquiere su transmisión, luego crea una de las clases anteriores y la asocia con la transmisión. Por ejemplo,

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

StreamReader y StreamWriter se convierten entre tipos nativos y sus representaciones de cadena y luego transfieren las cadenas hacia y desde la secuencia como bytes. Así que

myStreamWriter.Write(123);

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

Considerando

myBinaryWriter.Write(123);

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.)

Las transmisiones son buenas para tratar con 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.

Stream es solo una abstracción (o un envoltorio) sobre un físico de bytes. Este flujo físico se denomina flujo base . Por lo tanto, siempre hay un flujo base sobre el cual se crea una envoltura de flujo y, por lo tanto, el envoltorio recibe el nombre del tipo de flujo base, es decir, FileStream , MemoryStream etc.

La ventaja de la envoltura de flujo es que obtienes una api unificada para interactuar con flujos de cualquier tipo subyacente usb, file etc.

¿Por qué trataría los datos como flujo ? Debido a que los fragmentos de datos se cargan a pedido, podemos inspeccionar / procesar los datos como fragmentos en lugar de cargar los datos completos en memoria. Así es como la mayoría de los programas tratan con archivos grandes, por ejemplo, para cifrar un archivo de imagen del sistema operativo.

Solo 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 bytes dentro y fuera de un trozo de memoria. Por lo tanto, puedes llamar a Leer y Escribir en él.

Por otra parte, un FileStream le permite leer o escribir (o ambos) desde / a un archivo. Si puede leer o escribir realmente depende de cómo se abrió el archivo. No puede escribir en un archivo si solo lo abrió para acceso de lectura.

Comenzaría leyendo en streams en MSDN: http://msdn.microsoft.com/en-us/ library / system.io.stream.aspx

Memorystream y FileStream son secuencias que se utilizan para trabajar con memoria en bruto y Archivos respectivamente ...

No llamaría a esos tipos diferentes de flujos. La clase Stream tiene propiedades CanRead y CanWrite que le dicen si la secuencia en particular se puede leer y escribir.

La principal diferencia entre las diferentes clases de transmisión (como MemoryStream vs FileStream) es el almacén de respaldo, desde donde se leen los datos o se escriben. Es algo obvio por el nombre. Un MemoryStream almacena los datos solo en la memoria, un FileStream está respaldado por un archivo en el disco, un NetworkStream lee los datos de la red, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top