Domanda

Capisco che un flusso è una rappresentazione di una sequenza di byte.Ogni flusso fornisce mezzi per leggere e scrivere byte nel relativo archivio di backup.Ma qual è lo scopo del flusso?Perché non è il backing store stesso ciò con cui interagiamo?

Qualunque sia la ragione per cui questo concetto semplicemente non mi soddisfa.Ho letto un sacco di articoli, ma penso di aver bisogno di un'analogia o qualcosa del genere.

È stato utile?

Soluzione

La parola "stream" è stato scelto perché rappresenta (nella vita reale) un significato molto simile a quello che vogliamo trasmettere quando l'usiamo.

Lasciamo perdere l'archivio di backup per un po ', e cominciare a pensare al analogia con un flusso di acqua. Si riceve un flusso continuo di dati, proprio come l'acqua scorre continuamente in un fiume. Non necessariamente si sa dove i dati sono provenienti da, e il più delle volte non è necessario a; sia da un file, una presa di corrente, o di qualsiasi altra fonte, non (non dovrebbe) molta importanza. Questo è molto simile a ricevere un flusso di acqua, per cui non c'è bisogno di sapere dove è venuta da; sia da un lago, una fontana, o di qualsiasi altra fonte, non è così (non dovrebbe) molta importanza.

Detto questo, una volta che si comincia a pensare che si cura solo di ottenere i dati necessari, a prescindere da dove proviene, astrazioni altre persone parlato diventano più chiare. Si inizia a pensare che si può avvolgere i flussi, e i metodi continuerà a funzionare perfettamente. Ad esempio, si potrebbe fare questo:

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);

Come si vede, diventa molto facile per cambiare la sorgente d'ingresso senza cambiare la logica di elaborazione. Ad esempio, per leggere i dati da un socket di rete invece di un file:

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);

Per quanto facile come può essere. E la bellezza continua, come si può utilizzare qualsiasi tipo di sorgente di ingresso, fino a quando si può costruire un "wrapper" flusso per esso. Si potrebbe anche fare questo:

public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());

Vedi? Finchè il vostro metodo non importa quale sia la fonte di ingresso è, è possibile personalizzare la vostra fonte in vari modi. L'astrazione consente di disaccoppiare l'input da logica di elaborazione in un modo molto elegante.

Si noti che il flusso abbiamo creato noi stessi non dispone di un archivio di backup, ma serve ancora i nostri scopi perfettamente.

Quindi, per riassumere, un torrente è solo una fonte di entrata, nascondersi (astrarre) un'altra fonte. Finché non si rompono l'astrazione, il codice sarà molto flessibile.

Altri suggerimenti

Il punto è che non si dovrebbe avere per sapere qual è il negozio supporto è - è un'astrazione su di esso. Infatti, ci potrebbe anche non essere di un archivio di backup -. Si potrebbe essere la lettura da una rete, ed i dati non è mai "memorizzato" a tutti

Se è possibile scrivere codice che funziona se si sta parlando con un file system, la memoria, una rete o qualsiasi altra cosa che sostiene l'idea flusso, il codice è molto più flessibile.

Inoltre, i flussi sono spesso incatenati insieme - si può avere un flusso che comprime tutto ciò che è messo in esso, scrivendo la forma compressa a un altro corso d'acqua, o uno che cripta i dati, ecc All'altro estremo ci sarebbe essere la catena inversa, decifrare, decomprimere o qualsiasi altra cosa.

Il punto del torrente è quello di fornire un livello di astrazione tra voi e l'archivio di backup. Così un determinato blocco di codice che utilizza un flusso non hanno bisogno di cure, se l'archivio di backup è un file su disco, memoria, ecc ...

Non si tratta di corsi d'acqua - si tratta di nuoto. Se si può nuotare un ruscello, di quanto si può nuotare qualsiasi flusso si incontrano.

Per aggiungere alla cassa di risonanza, il flusso è un'astrazione in modo da non si preoccupano del negozio sottostante. Rende più senso se si considera gli scenari con e senza corsi d'acqua.

I file sono poco interessante per la maggior parte perché i flussi non fanno molto al di là di ciò che i metodi non-stream-based ho familiarità con lo fece. Cominciamo con i file di internet.

Se voglio scaricare un file da Internet, devo aprire un socket TCP, effettuare una connessione, e di ricevere i byte fino a quando non ci sono più byte. Ho gestire un buffer, conoscere la dimensione del file di attesa, e scrivere il codice per rilevare quando la connessione viene interrotta e gestire questa situazione in modo appropriato.

Diciamo che ho una sorta di oggetto TcpDataStream. Creo con le informazioni di connessione appropriato, quindi leggere byte dal flusso fino a quando si dice che non ci sono più byte. Il flusso gestisce le condizioni di gestione del buffer, di fine dei dati e la gestione delle connessioni.

In questo modo, i flussi facilitare I / O. Si potrebbe certamente scrivere una classe TcpFileDownloader che fa quello che il torrente fa, ma poi si deve una classe che è specifico per il protocollo TCP. La maggior parte delle interfacce di flusso forniscono semplicemente una read () e write () il metodo, ed eventuali concetti più complicati vengono gestiti dal implementazione interna. A causa di questo, è possibile utilizzare lo stesso codice di base per leggere o scrivere nella memoria, file su disco, prese, e molti altri archivi dati.

E 'solo un concetto, un altro livello di astrazione che rende la vita più facile. E tutti hanno un'interfaccia comune che significa che si possono combinare in un tubo di come il modo. Ad esempio, codificare Base64, poi zip e poi scrivere questo disco e il tutto in una sola riga!

La visualizzazione che uso è quella dei nastri trasportatori, non nelle fabbriche reali perché non ne so nulla, ma nelle fabbriche di cartoni animati dove gli oggetti si muovono lungo le linee e vengono stampati, imballati, contati e controllati da una sequenza di stupidi dispositivi.

Hai componenti semplici che fanno una cosa, ad esempio un dispositivo per mettere una ciliegina su una torta.Questo dispositivo ha un flusso di ingresso di torte senza ciliegie e un flusso di uscita di torte con ciliegie.Ci sono tre vantaggi che vale la pena menzionare strutturando la propria elaborazione in questo modo.

Innanzitutto semplifica i componenti stessi:se vuoi mettere la glassa al cioccolato su una torta, non hai bisogno di un dispositivo complicato che sappia tutto sulle torte, puoi creare un dispositivo stupido che attacca la glassa al cioccolato su qualunque cosa gli venga immessa (nei cartoni animati, questo arriva fino come non sapere che l'oggetto successivo non è una torta, è Wile E.Coyote).

In secondo luogo puoi creare prodotti diversi inserendo i dispositivi in ​​sequenze diverse:forse vuoi che le tue torte abbiano la glassa sopra la ciliegia invece della ciliegina sopra la glassa, e puoi farlo semplicemente scambiando i dispositivi sulla linea.

In terzo luogo, i dispositivi non devono gestire l'inventario, il boxing o l'unboxing.Il modo più efficiente di aggregare e confezionare le cose è modificabile:forse oggi metti le tue torte in scatole da 48 e le spedisci a camion, ma domani vuoi spedire scatole da sei in risposta a ordini personalizzati.Questo tipo di cambiamento può essere soddisfatto sostituendo o riconfigurando le macchine all'inizio e alla fine della linea di produzione;la macchina cherry al centro della linea non deve essere modificata per elaborare un numero diverso di articoli alla volta, funziona sempre con un articolo alla volta e non deve sapere come è l'input o l'output essere raggruppati.

Quando ho sentito parlare di streaming per la prima volta, era nel contesto di diretta streaming con una webcam.Pertanto, un host trasmette contenuto video e l'altro host riceve il contenuto video.Quindi è questo lo streaming?BENE...SÌ...ma il live streaming è un concetto concreto, e penso che la domanda si riferisca al concetto astratto di Streaming.Vedere https://en.wikipedia.org/wiki/Live_streaming

Quindi andiamo avanti.


Il video non è l'unica risorsa che può essere trasmessa in streaming.È possibile eseguire lo streaming del suono.Quindi stiamo parlando di streaming multimediale ora.Vedere https://en.wikipedia.org/wiki/Streaming_media .Ora confrontiamo tra loro alcuni metodi di consegna dei dati.

Download di file classiconon avviene in tempo reale.Prima di poter utilizzare il file, dovrai attendere il completamento del download.

Scaricamento progressivoconsente di guardare il file video mentre viene scaricato.È possibile l'avanzamento rapido e il riavvolgimento.Per fare ciò utilizza un buffer che memorizza temporaneamente i dati nella memoria del computer che riceve il file video.Anche se i dati sono suddivisi in blocchi, non si tratta di un vero streaming.

StreamingAvviene in tempo reale e suddivide i dati.Lo streaming è implementato nelle trasmissioni in diretta.I client che ascoltano la trasmissione non possono avanzare rapidamente o riavvolgere.Nei flussi video, i dati vengono eliminati dopo la riproduzione.

Uno Streaming Server mantiene una connessione bidirezionale con il suo client, mentre un Web Server chiude la connessione dopo una risposta del server.


Audio e video non sono l'unica cosa che può essere trasmessa in streaming.Diamo un'occhiata al concetto di stream nel manuale PHP.

uno stream è un oggetto risorsa che mostra un comportamento streaming.Cioè, può essere leggere da O scritto a In modo lineare e potrebbe essere in grado di fseek () in una posizione arbitraria all'interno del flusso.

In PHP, una risorsa è un riferimento a una fonte esterna come un file, una connessione a un database.Quindi, in altre parole, uno stream è una fonte da cui è possibile leggere o scrivere.Quindi, se hai lavorato con fopen(), allora hai già lavorato con i flussi.

È possibile eseguire lo streaming anche di testo, audio e file zip.Inoltre, lo streaming non è limitato ai file.È possibile eseguire lo streaming anche di connessioni HTTP, FTP, SSH e Input/Output.


Cosa dice Wikipedia sul concetto di Streaming?

In Informatica, un flusso è una sequenza di elementi di dati resi disponibili nel tempo.Un flusso può essere pensato come oggetti su un trasportatore che viene elaborato uno alla volta piuttosto che in grandi lotti.

Vedere: https://en.wikipedia.org/wiki/Stream_%28computing%29 .

Wikipedia si collega a questo: https://srfi.schemers.org/srfi-41/srfi-41.htmle gli autori hanno questo da dire sugli stream:

I flussi, a volte chiamati elenchi pigri, sono una struttura di dati sequenziali contenenti elementi calcolati solo su richiesta.Un flusso è nullo o è una coppia con un flusso nel suo CDR.Poiché gli elementi di un flusso vengono calcolati solo quando si accede, i flussi possono essere infiniti.

Quindi uno stream è in realtà una struttura dati.


La mia conclusione:un flusso è un'origine che può contenere dati che possono essere letti o scritti in modo sequenziale.Uno stream non legge tutto ciò che contiene la sorgente in una volta, legge/scrive in sequenza.


Link utili:

  1. http://www.slideshare.net/auroraeosrose/writing-and-using-php-streams-and-sockets-zendcon-2011 Fornisce una presentazione molto chiara
  2. https://www.sk89q.com/2010/04/introduction-to-php-streams/
  3. http://www.netlingo.com/word/stream-or-streaming.php
  4. http://www.brainbell.com/tutorials/php/Using_PHP_Streams.htm
  5. http://www.sitepoint.com/php-streaming-output-buffering-explained/
  6. http://php.net/manual/en/wrappers.php
  7. http://php.net/manual/en/intro.stream.php
  8. http://www.digidata-lb.com/streaming/Streaming_Proposal.pdf
  9. http://www.webopedia.com/TERM/S/streaming.html
  10. https://en.wikipedia.org/wiki/Stream_%28computing%29
  11. https://srfi.schemers.org/srfi-41/srfi-41.html

La migliore spiegazione di flussi che ho visto è capitolo 3 del SICP . (Potrebbe essere necessario leggere i primi 2 capitoli per poter dare un senso, ma si dovrebbe in ogni caso: -).

Non usano sterams per i byte a tutti, ma piuttosto interi. I grandi punti che ho ricevuto da esso sono stati:

    liste
  • Streams sono in ritardo
  • L'overhead computazionale [di entusiasmo calcolo tutto prima del tempo, in alcuni casi] è scandaloso
  • Si può utilizzare i flussi per rappresentare sequenze che sono infinitamente lungo

Un altro punto (Per la lettura situazione file):

  1. stream può consentire di fare qualcos'altro prima finished reading all content of the file.
  2. è possibile salvare la memoria, perché non c'è bisogno di caricare tutto il contenuto del file in una volta.

Pensate di flussi come di una sorgente astratta di dati (byte, caratteri, ecc). Essi astratti meccanismi reali di lettura e la scrittura all'origine dati concreti, che si tratti di una presa di rete, file su un disco o una risposta dal server Web.

Credo che è necessario considerare che l'archivio di backup in sé è spesso solo un altro astrazione. Un flusso di memoria è abbastanza facile da capire, ma un file è radicalmente diverso a seconda del sistema di file che si sta utilizzando, non importa quello del disco rigido che si sta utilizzando. Non tutti i corsi d'acqua non in realtà sedersi sulla cima di un negozio di supporto:. Network flussi praticamente solo sono flussi

Il punto di un ruscello è che noi restringiamo la nostra attenzione su ciò che è importante. Avendo un'astrazione normale, siamo in grado di eseguire le operazioni più comuni. Anche se non si vuole, per esempio, la ricerca di un file o di una risposta HTTP per gli URL di oggi, non significa che non si desidera domani.

Streams stati originariamente concepiti quando la memoria era minuscolo rispetto allo storage. Basta leggere un file C potrebbe essere un carico significativo. Minimizzando l'ingombro di memoria è estremamente importante. Quindi, un'astrazione in cui molto poco bisogno di essere caricato era molto utile. Oggi, è altrettanto utile durante l'esecuzione di comunicazione di rete e, a quanto pare, di rado che restrittiva quando abbiamo a che fare con i file. La possibilità di aggiungere in modo trasparente le cose come buffer in modo generale lo rende ancora più utile.

Un flusso è un'astrazione di una sequenza di byte. L'idea è che non hai bisogno di sapere dove i byte vengono, solo che li si può leggere in modo standardizzato.

Ad esempio, se si elabora i dati tramite una corrente, allora non importa al codice se i dati provengono da un file, una connessione di rete, una stringa, un blob in un database ecc ecc ecc.

Non c'è niente di male in sè, con l'interazione con l'archivio di backup in sé tranne per il fatto che esso si lega alla realizzazione archivio di backup.

Un flusso è un'astrazione che fornisce un insieme standard di metodi e proprietà per interagire con i dati. Astraendo dal supporto di memorizzazione attuale, il codice può essere scritto senza fare affidamento totale su ciò che mezzo è o anche l'attuazione di quel mezzo.

Una buona analogia potrebbe essere quella di prendere in considerazione una borsa. Non ti importa ciò che una borsa è realizzata in o ciò che fa quando si mette la roba in esso, fino a quando la borsa esegue il lavoro di essere una borsa e si può ottenere la vostra roba indietro. Un flusso definisce per supporti di memoria ciò che il concetto di borsa definisce per le diverse istanze di una borsa (come sacco della spazzatura, borsa, zaino, ecc.) - le regole di interazione

Lo terrò breve, stavo solo manca la parola qui:

Streams sono code solitamente memorizzata in tampone contenente qualsiasi tipo di dati.

(Ora, dal momento che tutti sappiamo cosa sono le code, non c'è bisogno di spiegare questo oltre.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top