C# Language
ruscello
Ricerca…
Usando i flussi
Un flusso è un oggetto che fornisce un mezzo di basso livello per trasferire i dati. Loro stessi non agiscono come contenitori di dati.
I dati che trattiamo sono in forma di array di byte ( byte []
). Le funzioni di lettura e scrittura sono tutte orientate ai byte, ad esempio WriteByte()
.
Non ci sono funzioni per gestire interi, stringhe, ecc. Ciò rende lo stream molto generico, ma meno semplice da utilizzare se, per esempio, si desidera semplicemente trasferire il testo. Gli stream possono essere particolarmente utili quando si ha a che fare con una grande quantità di dati.
Dovremo utilizzare diversi tipi di stream in base ai quali deve essere scritto / letto (ad esempio il backing store). Ad esempio, se la fonte è un file, dobbiamo usare FileStream
:
string filePath = @"c:\Users\exampleuser\Documents\userinputlog.txt";
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// do stuff here...
fs.Close();
}
Allo stesso modo, MemoryStream
viene utilizzato se il backing store è memoria:
// Read all bytes in from a file on the disk.
byte[] file = File.ReadAllBytes(“C:\\file.txt”);
// Create a memory stream from those bytes.
using (MemoryStream memory = new MemoryStream(file))
{
// do stuff here...
}
Allo stesso modo, System.Net.Sockets.NetworkStream
viene utilizzato per l'accesso alla rete.
Tutti gli stream derivano dalla classe generica System.IO.Stream
. I dati non possono essere letti o scritti direttamente dai flussi. .NET Framework fornisce classi helper come StreamReader
, StreamWriter
, BinaryReader
e BinaryWriter
che convertono tra i tipi nativi e l'interfaccia di flusso di basso livello e trasferiscono i dati al o dallo stream per te.
La lettura e la scrittura sugli stream possono essere eseguite tramite StreamReader
e StreamWriter
. Si dovrebbe fare attenzione quando si chiudono questi. Per impostazione predefinita, la chiusura chiuderà anche lo stream contenuto e lo renderà inutilizzabile per ulteriori utilizzi. Questo comportamento predefinito può essere modificato utilizzando un costruttore che ha il parametro bool leaveOpen
e ne imposta il valore come true
.
StreamWriter
:
FileStream fs = new FileStream("sample.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
string NextLine = "This is the appended line.";
sw.Write(NextLine);
sw.Close();
//fs.Close(); There is no need to close fs. Closing sw will also close the stream it contains.
StreamReader
:
using (var ms = new MemoryStream())
{
StreamWriter sw = new StreamWriter(ms);
sw.Write(123);
//sw.Close(); This will close ms and when we try to use ms later it will cause an exception
sw.Flush(); //You can send the remaining data to stream. Closing will do this automatically
// We need to set the position to 0 in order to read
// from the beginning.
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
var myStr = sr.ReadToEnd();
sr.Close();
ms.Close();
}
Poiché Classes Stream
, StreamReader
, StreamWriter
, ecc. Implementano l'interfaccia IDisposable
, possiamo chiamare il metodo Dispose()
sugli oggetti di queste classi.