Cosa significa stream? Quali sono le sue caratteristiche?

Sia C ++ che C # usano questo stream parole per nominare molte classi.

  • C ++: iostream , istream , ostream , stringstream , ostream_iterator , istream_iterator e così via.
  • C #: Stream , FileStream , MemoryStream , BufferedStream e così via.

Quindi mi ha incuriosito sapere cosa significa stream ? Quali sono le caratteristiche di un stream? Quando posso usare questo termine per nominare le mie classi? È limitato alle sole classi I / O di file?

È interessante notare che C non usa questa parola da nessuna parte, per quanto ne so.

Molte strutture di dati (elenchi, raccolte, ecc.) Fungono da contenitori : contengono una serie di oggetti. Ma non un stream; se una lista è un secchio, allora un stream è un tubo. Puoi estrarre dati da un stream o inviare dati in un stream, ma normalmente solo una volta e solo in una direzione (ci sono ovviamente delle eccezioni). Ad esempio, i dati TCP su una rete sono uno stream; è ansible inviare (o ricevere) blocchi di dati, ma solo in connessione con l’altro computer, e solitamente solo una volta, non è ansible riavvolgere Internet.

Gli stream possono anche manipolare i dati che li attraversano; flussi di compressione, flussi di crittografia, ecc. Ma ancora una volta – la metafora sottostante qui è un tubo di dati. Un file è anche generalmente accessibile (a un certo livello) come un stream; è ansible accedere a blocchi di dati sequenziali. Naturalmente, la maggior parte dei file system fornisce anche accesso casuale, quindi i flussi offrono cose come Seek, Position, Length etc – ma non tutte le implementazioni supportano tali. Non ha senso cercare alcuni flussi o ottenere la lunghezza di un socket aperto.

C’è un paio di significati diversi. # 1 è quello che probabilmente intendi, ma potresti anche voler guardare anche il n.

  1. Nelle librerie come quelle che hai citato, un “stream” è solo un’astrazione per “dati binari”, che possono o non possono essere accesso casuale (al contrario dei dati che vengono generati continuamente, come se stessimo scrivendo un stream che generato dati casuali), o che possono essere memorizzati ovunque (nella RAM, sul disco rigido, su una rete, nel cervello dell’utente, ecc.). Sono utili perché consentono di evitare i dettagli e di scrivere codice generico a cui non interessa la particolare fonte del stream.

  2. Come concetto più generale di informatica, un “stream” a volte viene pensato (in modo approssimativo) come “quantità di dati finita o infinita”. Il concetto è un po ‘difficile da spiegare senza un esempio, ma nella programmazione funzionale (come in Scheme), puoi trasformare un object con stato in un object stateless, trattando la storia dell’object come un “stream” di modifiche. (L’idea è che lo stato di un object può cambiare nel tempo, ma se si considera l’intera vita dell’object come un “stream” di modifiche, lo stream nel suo complesso non cambia mai, e si può fare programmazione funzionale con esso.)

Da flussi di I / O (anche se in java, il significato è lo stesso in C ++ / C #)

Un stream I / O rappresenta una sorgente di ingresso o una destinazione di uscita. Uno stream può rappresentare diversi tipi di fonti e destinazioni, inclusi file su disco, dispositivi, altri programmi e array di memoria.

Gli stream supportano molti tipi diversi di dati, inclusi semplici byte, tipi di dati primitivi, caratteri localizzati e oggetti. Alcuni flussi trasmettono semplicemente dati; altri manipolano e trasformano i dati in modi utili.

Indipendentemente dal loro funzionamento interno, tutti i flussi presentano lo stesso modello semplice ai programmi che li utilizzano: uno stream è una sequenza di dati. Un programma utilizza un stream di input per leggere i dati da un’origine, un elemento alla volta.

In C #, i flussi che hai citato derivano dalla class di base astratta Stream . Ogni implementazione di questa class base ha uno scopo specifico.

Ad esempio, FileStream supporta operazioni di lettura / scrittura su un file, mentre MemoryStream funziona su un object di stream in memoria. A differenza delle classi FileStream e MemoryStream , la class BufferedStream consente all’utente di bufferizzare l’I / O.

Oltre alle classi precedenti, ci sono diverse altre classi che implementano la class Stream . Per un elenco completo, consultare la documentazione MSDN sulla class Stream .

Termini e spiegazioni ufficiali a parte, il stream di parole stesso è stato preso dal stream della “vita reale”: invece dell’acqua, i dati vengono trasferiti da un luogo all’altro.

Per quanto riguarda la domanda che hai posto e che non è ancora stata introdotta, puoi assegnare un nome alle tue classi nei nomi che contengono stream, ma solo se implementi una sorta di nuovo stream avrà un significato corretto.

Nelle funzioni C definite in operano sugli stream.

Sezione 7.19.2 I flussi in C99 discutono di come si comportano, anche se non di ciò che sono, a parte “una sequenza ordinata di caratteri”.

Il razionale fornisce più contesto nella sezione corrispondente, a partire da:

C ha ereditato la sua nozione di stream di testo dall’ambiente UNIX in cui è nato.

Ecco da dove viene il concetto.