new - C#usando flujos
streaming video c# (8)
Bueno, en la mayoría de los casos puedes leer y escribir en una transmisión, una secuencia de memoria es algo que puedes declarar para que puedas trabajar con datos en la memoria y una secuencia de archivos es una secuencia que apunta a un archivo, así que cuando escribes o lees formar una secuencia de archivos luego está leyendo / escribiendo el archivo.
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?
Si entiendo correctamente, hay tres tipos de flujo:
stream
-
read stream
-
write stream
¿Es esto correcto? Y, por ejemplo, ¿cuál es la diferencia entre un Memorystream
y un FileStream
?
Comenzaría leyendo en las transmisiones en MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream y FileStream son transmisiones usadas para trabajar con la memoria sin procesar y los archivos respectivamente ...
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 abrirlos como una secuencia y trabajar con pequeños fragmentos de la misma.
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 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.
Para ampliar un poco sobre otras respuestas aquí, y ayudar a explicar una gran cantidad del código de ejemplo que verá punteado, la mayoría de las veces no lee ni escribe directamente en una transmisión. Las transmisiones son un medio de bajo nivel para transferir datos.
Notará que las funciones de lectura y escritura están orientadas por byte, por ejemplo, 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 hacia o desde la transmisión por usted. Algunas clases notables son:
StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
Para usarlos, primero adquiere su secuencia, luego crea una de las clases anteriores y la asocia con la secuencia. P.ej
MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
StreamReader y StreamWriter convierten entre tipos nativos y sus representaciones de cadena y luego transfieren las cadenas hacia y desde la secuencia como bytes. Asi que
myStreamWriter.Write(123);
escribirá "123" (tres caracteres "1", "2" y "3") en la transmisión. Si se trata de archivos de texto (por ejemplo, html), StreamReader y StreamWriter son las clases que usaría.
Mientras
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 su endianness , pero esa es otra publicación).
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 pedazo de memoria. Por lo tanto, puede llamar a Leer y Escribir en él.
Por otro lado, 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.
Stream es solo una abstracción (o un contenedor) sobre un flujo physical
de bytes. Esta secuencia physical
se llama la base stream
. Por lo tanto, siempre hay una secuencia base sobre la cual se crea una envoltura de flujo y, por lo tanto, la envoltura se nombra después 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 las secuencias de cualquier tipo de usb, file
subyacente usb, file
etc.
¿Por qué trataría los datos como flujo continuo? Dado que los fragmentos de datos se cargan a pedido, 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, encriptando un archivo de imagen del sistema operativo.
Una secuencia es un objeto utilizado para transferir datos. Existe una clase de flujo genérica System.IO.Stream
, de la que se derivan todas las demás clases de flujo en .NET. La clase Stream
trata con bytes.
Las clases de flujo concretas se usan para tratar otros tipos de datos además de los bytes. Por ejemplo:
- La clase
FileStream
se usa cuando la fuente externa es un archivo -
MemoryStream
se usa para almacenar datos en la memoria -
System.Net.Sockets.NetworkStream
maneja datos de red
Las secuencias de lector / escritor 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 desde y para transmitir.