Las corrientes son algo misteriosas para mí. No sé cuándo usar qué flujo y cómo usarlo. ¿Alguien puede explicarme cómo se utilizan las transmisiones?
Si lo entiendo correctamente, hay tres tipos de transmisión:
stream
read stream
write stream
¿Es esto correcto? Y, por ejemplo, ¿cuál es la diferencia entre ay Memorystream
a FileStream
?
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 heredanStream
y se basan en esa funcionalidad en función del almacén de respaldo en particular.Respuestas:
Una secuencia es un objeto que se utiliza 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. LaStream
clase se ocupa de bytes.Las clases de flujo concretas se utilizan para tratar otros tipos de datos además de los bytes. Por ejemplo:
FileStream
clase se usa cuando la fuente externa es un archivoMemoryStream
se utiliza para almacenar datos en la memoriaSystem.Net.Sockets.NetworkStream
maneja datos de redLas transmisiones de lectura / escritura como
StreamReader
yStreamWriter
no son transmisiones; no se derivan deSystem.IO.Stream
ellas, están diseñadas para ayudar a escribir y leer datos desde y hacia la transmisión.fuente
Para ampliar un poco otras respuestas aquí, y ayudar a explicar gran parte del código de ejemplo que verá punteado, la mayoría de las veces no lee y escribe en una transmisión directamente. Las transmisiones son un medio de bajo nivel para transferir datos.
Notará que las funciones de lectura y escritura están todas orientadas a bytes, por ejemplo WriteByte (). No hay funciones para tratar con números enteros, cadenas, etc. Esto hace que la secuencia sea de propósito general, pero menos simple de trabajar si, por ejemplo, solo desea transferir texto.
Sin embargo, .NET proporciona clases que convierten entre tipos nativos y la interfaz de flujo de bajo nivel, y transfiere los datos hacia o desde el flujo por usted. Algunas clases notables son:
Para usarlos, primero adquiere su flujo, luego crea una de las clases anteriores y la asocia con el flujo. P.ej
StreamReader y StreamWriter convierten entre tipos nativos y sus representaciones de cadenas y luego transfieren las cadenas hacia y desde la secuencia como bytes. Entonces
escribirá "123" (tres caracteres '1', '2' y luego '3') en la secuencia. Si está tratando con archivos de texto (por ejemplo, html), StreamReader y StreamWriter son las clases que usaría.
Mientras
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 los que podría usar. (Si está intercambiando datos con redes u otros sistemas, debe tener en cuenta el endianismo , pero esa es otra publicación).
fuente
Los flujos son buenos para manejar grandes cantidades de datos. Cuando no es práctico cargar todos los datos en la memoria al mismo tiempo, puede abrirlo como una secuencia y trabajar con pequeños fragmentos.
fuente
Stream es solo una abstracción (o un contenedor) sobre un
physical
flujo de bytes. Estaphysical
secuencia se llamabase stream
. Por lo tanto, siempre hay una secuencia base sobre la que se crea una envoltura de secuencia y, por lo tanto, la envoltura recibe el nombre del tipo de secuencia base, es decirFileStream
,MemoryStream
etc.La ventaja del contenedor de transmisión es que obtiene una api unificada para interactuar con transmisiones de cualquier tipo subyacente,
usb, file
etc.¿Por qué trataría los datos como flujo ? Debido a que los fragmentos de datos se cargan bajo demanda, podemos inspeccionar / procesar los datos como fragmentos en lugar de cargar todos los datos en la memoria. Así es como la mayoría de los programas tratan con archivos grandes, por ejemplo, cifrando un archivo de imagen del sistema operativo.
fuente
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 una parte de la memoria. Por lo tanto, puede llamar a Leer y Escribir en él.Por otro lado, a le
FileStream
permite leer o escribir (o ambos) desde / hacia 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.fuente
Comenzaría leyendo sobre transmisiones en MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream y FileStream son flujos que se utilizan para trabajar con memoria bruta y archivos respectivamente ...
fuente
Yo no llamaría a esos diferentes tipos de corrientes. La clase Stream tiene propiedades CanRead y CanWrite que le indican si se puede leer y escribir en el flujo particular.
La principal diferencia entre las diferentes clases de transmisión (como MemoryStream vs FileStream) es el almacén de respaldo, donde se leen los datos o donde 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 datos de la red y así sucesivamente.
fuente