2009-08-01 16 views
70

¿Qué es una transmisión en el mundo de la programación? ¿Por qué lo necesitamos?¿Qué es una corriente?

Explique amablemente con la ayuda de una analogía, si es posible.

+8

Este es un duplicado de http://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streams. –

Respuesta

101

Una secuencia representa una secuencia de objetos (generalmente bytes, pero no necesariamente), a los que se puede acceder en orden secuencial. Operaciones típicas en una secuencia:

  • lee un byte. La próxima vez que lea, obtendrá el siguiente byte, y así sucesivamente.
  • leer varios bytes de la transmisión en una matriz
  • buscar (moverse de su posición actual en la corriente, por lo que la próxima vez que lea usted consigue bytes desde la nueva posición)
  • escribir un byte
  • escribir varios bytes desde una matriz en la secuencia
  • omitir bytes de la secuencia (esto es como leer, pero ignora los datos. O si lo prefiere es como buscar pero solo puede avanzar)
  • retraer bytes en una entrada stream (esto es como "deshacer" para leer, inserta unos pocos bytes en la secuencia, para que la próxima vez que lea t es lo que verás. Es en ocasiones útiles para analizadores, como es:
  • peek (mira bytes sin leerlos, por lo que todavía están allí en la corriente que se leerá más adelante)

Una corriente particular puede apoyar la lectura (en que caso es un "flujo de entrada"), escritura ("flujo de salida") o ambos. No todas las secuencias son buscables.

El retrotraer es bastante raro, pero siempre puede agregarlo a una secuencia al envolver el flujo de entrada real en otro flujo de entrada que contiene un búfer interno. Las lecturas provienen del búfer, y si retrocede, los datos se colocan en el búfer. Si no hay nada en el búfer, la secuencia de retroceso se lee desde la transmisión real. Este es un ejemplo simple de un "adaptador de flujo": se encuentra en el "extremo" de una secuencia de entrada, es una secuencia de entrada en sí misma y hace algo extra que la transmisión original no hizo.

Stream es una abstracción útil porque puede describir archivos (que en realidad son matrices, por lo tanto buscar es sencillo) pero también entrada/salida de terminal (que no se puede buscar a menos que esté almacenado), puertos serie, etc. escriba el código que diga "Quiero algunos datos, y no me importa de dónde viene o cómo llegó hasta aquí", o "Produciré algunos datos, y depende totalmente de mi interlocutor de lo que le ocurra". El primero toma un parámetro de flujo de entrada, este último toma un parámetro de flujo de salida.

La mejor analogía que puedo pensar es que una corriente es una cinta transportadora que viene hacia usted o que se aleja de usted (o a veces ambas). Sacas cosas de un flujo de entrada, pones cosas en un flujo de salida. Algunos transportadores que se puede pensar que salen de un agujero en la pared: no se pueden buscar, leer o escribir es un trato por única vez. Algunas cintas transportadoras están dispuestas frente a usted, y puede avanzar eligiendo el paradero en la secuencia que desea leer/escribir, eso es lo que está buscando.

Como dice IRBMe, sin embargo, es mejor pensar en un flujo en términos de las operaciones que ofrece (que varían de implementación a implementación, pero tienen mucho en común) en lugar de una analogía física. Los flujos son "cosas que puedes leer o escribir". Cuando comience a conectar adaptadores de flujo, puede considerarlos como una caja con una cinta transportadora y una cinta transportadora hacia afuera, que conecta con otras transmisiones y luego la caja realiza alguna transformación en los datos (comprimirla o cambiar las líneas de alimentación de UNIX) a DOS, o lo que sea). Las tuberías son otra prueba minuciosa de la metáfora: ahí es donde creas un par de secuencias para que cualquier cosa que escribas en una pueda leerse de la otra. Piensa en los agujeros de gusano :-)

+1

Con mucho, la mejor explicación que he leído. Junto con lo que dice el SICP ("El procesamiento de flujo nos permite modelar sistemas que tienen estado sin utilizar nunca datos de asignación o mutables"), creo que finalmente lo entiendo. ¡Gracias! –

24

Una transmisión ya es una metáfora, una analogía, por lo que realmente no es necesario proporcionar otra. Puedes pensarlo básicamente como una tubería con un flujo de agua donde el agua en realidad es información y la tubería es la corriente. Supongo que es una especie de tubería de dos vías si la transmisión es bidireccional. Básicamente es una abstracción común que se coloca sobre las cosas donde hay un flujo o secuencia de datos en una o ambas direcciones.

En idiomas como C#, VB.Net, C++, Java, etc., la metáfora de la secuencia se utiliza para muchas cosas. Hay secuencias de archivos, en las que abre un archivo y puede leer de la secuencia o escribir en ella; Hay flujos de red en los que la lectura y la escritura de la secuencia se lee y escribe en una conexión de red establecida subyacente. Las secuencias para escritura solo se denominan corrientemente salidas, como en el ejemplo this, y de forma similar, las secuencias que son solo para lectura se denominan flujos de entrada, como en el ejemplo this.

Una secuencia puede realizar la transformación o codificación de datos (un SslStream en .Net, por ejemplo, consumirá los datos de negociación de SSL y lo ocultará; un TelnetStream podría ocultar las negociaciones de Telnet, pero proporcionar acceso a los datos; A ZipOutputStream en Java le permite escribir en archivos en un archivo zip sin tener que preocuparse por las partes internas del formato de archivo zip.

Otra cosa común que puede encontrar son las secuencias textuales que le permiten escribir cadenas en su lugar de bytes, o algunos idiomas proporcionan secuencias binarias que le permiten escribir tipos primitivos. Una cosa común que encontrará en las secuencias de texto es una codificación de caracteres, que debe tener en cuenta.

Algunas transmisiones también admiten el acceso aleatorio, como en el ejemplo this. Una transmisión de red, por otra parte, por razones obvias, no lo haría.

  • MSDN ofrece una buena visión general de las transmisiones en .Net.
  • Sun también tienen una visión general de su clase general OutputStream y clase InputStream.
  • En C++, aquí está el istream (secuencia de entrada), ostream (secuencia de salida) y iostream (secuencia bidireccional) documentación.

Los sistemas operativos similares a UNIX también admiten el modelo de flujo con entrada y salida de programa, como se describe en here.

5

Además de las cosas mencionadas anteriormente hay un tipo diferente de flujos, como se define en los lenguajes de programación funcional como Scheme o Haskell, una estructura de datos posiblemente infinita que se genera por alguna función bajo demanda.

4

Otra analogía: no se puede nadar contra una secuencia, es por eso que se puede tomar el siguiente bit, byte, cadena u objeto de la secuencia, mientras se borran los datos ya leídos. Un billete de ida...o básicamente solo una cola sin almacenar la persistencia.

Entonces, ¿necesitamos colas? Tú decides.

+0

significa que en una secuencia, debe avanzar y no puede retroceder. Además, los datos anteriores se borran a medida que avanzas y guardas la memoria? –

3

La palabra "secuencia" se ha elegido porque representa (en la vida real) un significado muy similar a lo que queremos transmitir cuando lo usamos.

Comienza a pensar en la analogía de una corriente de agua. Usted recibe un flujo continuo de datos, al igual que el agua fluye continuamente en un río. No necesariamente sabe de dónde provienen los datos, y la mayoría de las veces no es necesario; ya sea desde un archivo, un socket o cualquier otra fuente, no importa (no debería). Esto es muy similar a recibir una corriente de agua, por lo que no necesita saber de dónde viene; ya sea de un lago, una fuente o cualquier otra fuente, no importa (no debería). source