Domanda

I flussi sono in qualche modo misteriosi per me. Non so quando usare quale stream e come usarli. Qualcuno può spiegarmi come vengono utilizzati i flussi?

Se ho capito bene, ci sono tre tipi di stream:

  • flusso
  • leggi stream
  • scrivi stream

È corretto? E, ad esempio, qual è la differenza tra un Memorystream e un FileStream ?

È stato utile?

Soluzione

Un flusso è un oggetto utilizzato per trasferire dati. Esiste una classe di flusso generica System.IO.Stream , da cui derivano tutte le altre classi di flusso in .NET. La classe Stream tratta i byte.

Le classi di stream concrete vengono utilizzate per gestire altri tipi di dati oltre ai byte. Ad esempio:

  • La classe FileStream viene utilizzata quando l'origine esterna è un file
  • MemoryStream viene utilizzato per archiviare i dati in memoria
  • System.Net.Sockets.NetworkStream gestisce i dati di rete
I flussi

??Reader / writer come StreamReader e StreamWriter non sono flussi: non sono derivati ??da System.IO.Stream , sono progettato per aiutare a scrivere e leggere dati da e per lo streaming!

Altri suggerimenti

Per espandere un po 'le altre risposte qui e aiutare a spiegare molto del codice di esempio che vedrai punteggiato, la maggior parte delle volte non leggi e scrivi direttamente su uno stream. Gli stream sono un mezzo di basso livello per trasferire dati.

Noterai che le funzioni di lettura e scrittura sono tutte orientate ai byte, ad es. WriteByte (). Non ci sono funzioni per gestire numeri interi, stringhe ecc. Questo rende lo stream molto generico, ma meno semplice da utilizzare se, per esempio, vuoi semplicemente trasferire del testo.

Tuttavia, .NET fornisce classi che convertono tra tipi nativi e l'interfaccia di flusso di basso livello e trasferiscono i dati da o verso lo stream per te. Alcune classi degne di nota sono:

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader

Per usarli, prima acquisisci il tuo stream, quindi crei una delle classi sopra e lo associ allo stream. Per es.

MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);

StreamReader e StreamWriter eseguono la conversione tra i tipi nativi e le loro rappresentazioni di stringa, quindi trasferiscono le stringhe da e verso lo stream come byte. Quindi

myStreamWriter.Write(123);

scriverà "123" (tre caratteri "1", "2" e "3") nello stream. Se hai a che fare con file di testo (ad es. Html), StreamReader e StreamWriter sono le classi che useresti.

considerando che

myBinaryWriter.Write(123);

scriverà quattro byte che rappresentano il valore intero a 32 bit 123 (0x7B, 0x00, 0x00, 0x00). Se hai a che fare con file binari o protocolli di rete, BinaryReader e BinaryWriter sono ciò che potresti usare. (Se stai scambiando dati con reti o altri sistemi, devi essere consapevole di endianness , ma questo è un altro post.)

I flussi sono utili per gestire grandi quantità di dati. Quando non è pratico caricare tutti i dati in memoria contemporaneamente, è possibile aprirli come flusso e lavorare con piccoli pezzi di esso.

Il flusso è solo un'astrazione (o un wrapper) su un flusso di byte fisico . Questo flusso fisico è chiamato flusso base . Quindi esiste sempre un flusso di base sul quale viene creato un wrapper di flusso e quindi il wrapper prende il nome dal tipo di flusso di base, ad esempio FileStream , MemoryStream ecc.

Il vantaggio dello stream wrapper è che ottieni un API unificato per interagire con flussi di qualsiasi tipo sottostante usb, file ecc.

Perché dovresti trattare i dati come stream - poiché i blocchi di dati sono caricati su richiesta, possiamo ispezionare / elaborare i dati come blocchi piuttosto che caricarli in memoria. Questo è il modo in cui la maggior parte dei programmi gestisce file di grandi dimensioni, ad esempio crittografando un file di immagine del sistema operativo.

Esiste un solo tipo di base di Stream . Tuttavia, in varie circostanze, alcuni membri genereranno un'eccezione quando vengono chiamati perché in tale contesto l'operazione non era disponibile.

Ad esempio un MemoryStream è semplicemente un modo per spostare i byte dentro e fuori un pezzo di memoria. Quindi puoi chiamare Leggi e scrivi su di esso.

D'altra parte un FileStream ti permette di leggere o scrivere (o entrambi) da / in un file. La possibilità di leggere o scrivere effettivamente dipende da come è stato aperto il file. Non puoi scrivere su un file se lo hai aperto solo per l'accesso in lettura.

Vorrei iniziare leggendo sui flussi su MSDN: http://msdn.microsoft.com/en-us/ biblioteca / system.io.stream.aspx

Memorystream e FileStream sono stream usati per lavorare rispettivamente con memoria raw e File ...

Non chiamerei questi diversi tipi di flussi. La classe Stream ha proprietà CanRead e CanWrite che indicano se il flusso specifico può essere letto e scritto.

La principale differenza tra le diverse classi di stream (come MemoryStream vs FileStream) è l'archivio di backup - da dove vengono letti i dati o dove vengono scritti. È abbastanza ovvio dal nome. Un MemoryStream memorizza solo i dati in memoria, un FileStream è supportato da un file su disco, un NetworkStream legge i dati dalla rete e così via.

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