Per espandere un po 'altre risposte qui e aiutare a spiegare gran parte del codice di esempio che vedrai punteggiato, la maggior parte delle volte non leggi e scrivi direttamente in uno stream. I flussi sono un mezzo di basso livello per trasferire i dati.
Noterai che le funzioni di lettura e scrittura sono tutte orientate ai byte, ad esempio WriteByte (). Non ci sono funzioni per trattare numeri interi, stringhe, ecc. Questo rende il flusso molto generico, ma meno semplice da usare se, diciamo, vuoi solo trasferire del testo.
Tuttavia, .NET fornisce classi che convertono tra tipi nativi e l'interfaccia del flusso di basso livello e trasferisce i dati al o dal flusso 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 la associ allo stream. Per esempio
MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
StreamReader e StreamWriter convertono tra i tipi nativi e le loro rappresentazioni di stringa, quindi trasferiscono le stringhe da e verso il flusso come byte. Così
myStreamWriter.Write(123);
scriverà "123" (tre caratteri "1", "2" e poi "3") nello stream. Se hai a che fare con file di testo (es. Html), StreamReader e StreamWriter sono le classi che useresti.
Mentre
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 dell'endianness , ma questo è un altro post.)