2011-02-28 37 views
49

C++ y C# usan esta palabra stream para nombrar muchas clases.¿Qué significa stream? ¿Cuáles son sus características?

  • C++: iostream, istream, ostream, stringstream, ostream_iterator, istream_iterator y así sucesivamente.
  • C#: Stream, FileStream, MemoryStream, BufferedStream y así sucesivamente.

Me hizo curiosidad saber qué significa stream? ¿Cuáles son las características de una corriente? ¿Cuándo puedo usar este término para nombrar mis clases? ¿Esto está limitado a presentar clases de E/S solamente?

Curiosamente, C no usa esta palabra en ninguna parte, hasta donde yo sé.

+4

+1 por hacer una buena pregunta! – Nawaz

+2

+1 Otra forma más formal de hacer la misma pregunta sería: ¿Cuál es el tipo de datos abstractos de una transmisión? –

Respuesta

65

Muchas estructuras de datos (listas, colecciones, etc.) actúan como contenedores - contienen un conjunto de objetos. Pero no una corriente; si una lista es un cubo, entonces una secuencia es una manguera. Puede extraer datos de una secuencia o insertar datos en una secuencia, pero normalmente solo una vez y solo en una dirección (hay excepciones, por supuesto). Por ejemplo, los datos TCP sobre una red son una secuencia; puede enviar (o recibir) trozos de datos, pero solo en conexión con la otra computadora, y generalmente solo una vez; no puede rebobinar Internet.

Las transmisiones también pueden manipular los datos que pasan a través de ellas; flujos de compresión, flujos de encriptación, etc. Pero nuevamente, la metáfora subyacente aquí es una manguera de datos. Un archivo generalmente también se accede (en algún nivel) como una secuencia; puedes acceder a bloques de datos secuenciales. Por supuesto, la mayoría de los sistemas de archivos también brindan acceso aleatorio, por lo que los streams ofrecen cosas como Seek, Position, Length, etc., pero no todas las implementaciones admiten eso. No tiene sentido buscar algunas transmisiones u obtener la longitud de un socket abierto.

+18

+1 no podemos rebobinar Internet, pero Al Gore o Chunk Norris sí. – bryanbcook

+5

+1 Voy a utilizar el nombre 'hose' la próxima vez que cree una clase de secuencia:' io_hose', 'memory_hose',' network_hose'. ; P ¡En serio, gran metáfora! –

+1

@Emile: No serías el primero. Por ejemplo, twitter usa nombres como "firehose", "gardenhose" y "spritzer". – Brian

3

De I/O Streams (aunque en java, el significado es el mismo en C++/C#)

An/O Corriente I representa una fuente de entrada o un destino de salida. Una secuencia puede representar diferentes tipos de orígenes y destinos , incluyendo archivos de disco, dispositivos, otros programas y matrices de memoria.

corrientes apoyo de muchos tipos diferentes de datos, incluyendo bytes simples, tipos de datos primitivos, localizadas personajes y objetos. Algunas corrientes simplemente pasan datos; otros manipulan y transforman los datos de manera útil.

No importa cómo funcionan internamente, todas las corrientes presentan el mismo modelo simple a los programas que los utilizan: Una corriente es una secuencia de datos. Un programa utiliza una secuencia de entrada para leer datos de una fuente, un elemento en un tiempo .

En C#, las secuencias que ha mencionado derivan de la clase base abstracta Stream. Cada implementación de esta clase base tiene un propósito específico.

Por ejemplo, FileStream admite operaciones de lectura/escritura en un archivo, mientras que MemoryStream funciona en un objeto de flujo en memoria. A diferencia de las clases FileStream y MemoryStream, la clase BufferedStream permite al usuario almacenar en búfer las E/S.

Además de las clases anteriores, hay varias otras clases que implementan la clase Stream. Para obtener una lista completa, consulte el MSDN documentation en la clase Stream.

3

Hay un par de significados diferentes. # 1 es lo que probablemente quiere decir, pero es posible que desee ver el # 2 también.

  1. En las bibliotecas como las que usted ha mencionado, un "flujo" es sólo una abstracción para "datos binarios", que pueden o no ser de acceso aleatorio (en contraposición a los datos que se genera de forma continua, como por ejemplo si estaba escribiendo una secuencia que generó datos aleatorios), o que puede almacenarse en cualquier lugar (en RAM, en el disco duro, en una red, en el cerebro del usuario, etc.). Son útiles porque te permiten evitar los detalles y escribir código genérico que no se preocupa por la fuente particular de la transmisión.

  2. Como un concepto más general de informática, a veces se piensa en una "corriente" (vagamente) como "cantidad de datos finita o infinita". El concepto es un poco difícil de explicar sin un ejemplo, pero en la programación funcional (como en Scheme), puede convertir un objeto con estado en un objeto sin estado, al tratar el historial del objeto como una "secuencia" de cambios. (La idea es que el estado de un objeto puede cambiar con el tiempo, pero si trata la vida entera del objeto como una "secuencia" de cambios, la secuencia como un todo nunca cambia, y puede hacer programación funcional con ella.)

0

En C las funciones definidas en <stdio.h> funcionan en transmisiones.

Sección 7.19.2 Las corrientes en C99 describen cómo se comportan, aunque no lo que son, aparte de "una secuencia ordenada de caracteres".

El rationale da más contexto en la sección correspondiente, a partir de:

C heredó su noción de texto corrientes desde el entorno UNIX en la que nació.

De ahí viene el concepto.

2

términos oficiales y explicaciones a un lado, la corriente de la palabra sí fue tomado de la "vida real" stream - en lugar de agua, los datos se transfieren de un lugar a otro.

En cuanto a la pregunta que hizo y aún no recibió una respuesta, puede poner sus propias clases en nombres que contengan transmisión, pero solo si implementa algún tipo de nueva transmisión tendrá el significado correcto.

Cuestiones relacionadas