Ce face StreamReader și StreamWriter
StreamWriter scrie text (implicit UTF-8 fără BOM) cu Write și WriteLine; cu append: true adaugă la sfârșitul fișierului în loc să-l suprascrie. Datele ajung pe disc sigur doar după Flush sau Dispose, de aceea writer-ul se folosește mereu cu using.
StreamReader citește cu ReadLine() (întoarce null la sfârșit), ReadToEnd() sau variantele async. Pentru fișiere mari, citirea linie cu linie folosește puțină memorie, spre deosebire de File.ReadAllText.
Ambele funcționează peste orice Stream: fișier, MemoryStream, răspuns HTTP sau stream comprimat.
Exemple
Exemplul 1: Scriere, adăugare și citire linie cu linie
using (var w = new StreamWriter("note.txt"))
{
w.WriteLine("Ana,9");
w.WriteLine("Mihai,7");
}
using (var w = new StreamWriter("note.txt", append: true))
w.WriteLine("Ioana,10");
using var r = new StreamReader("note.txt");
string? linie;
int nr = 0;
while ((linie = r.ReadLine()) is not null)
{
string[] parti = linie.Split(',');
Console.WriteLine($"{++nr}. {parti[0]} are nota {parti[1]}");
}
Rezultat
1. Ana are nota 9
2. Mihai are nota 7
3. Ioana are nota 10
Exemplul 2: Filtrarea unui jurnal cu ReadLineAsync
await File.WriteAllLinesAsync("server.log",
["INFO pornit", "EROARE disc plin", "INFO cerere /", "EROARE timeout"]);
using var cititor = new StreamReader("server.log");
int erori = 0;
while (await cititor.ReadLineAsync() is { } linie)
{
if (linie.StartsWith("EROARE"))
{
erori++;
Console.WriteLine(linie);
}
}
Console.WriteLine($"Total erori: {erori}");
Rezultat
EROARE disc plin
EROARE timeout
Total erori: 2
Greșeli frecvente
- Writer fără
usingsauDispose: ultimele linii rămân în buffer și nu ajung în fișier. - Deschiderea aceluiași fișier pentru citire cât timp un writer îl ține deschis aruncă
IOException. Închide writer-ul înainte (blocusingseparat). new StreamWriter(cale)suprascrie fișierul existent; pentru adăugare dăappend: true.
Comenzi înrudite
Stream, FileStream și MemoryStream: Stream este baza pentru citirea și scrierea de octeți; FileStream lucrează cu fișiere, MemoryStream cu un buffer din memorie.Path (Combine, GetFileName, GetExtension): Construiește și desface căi de fișiere fără să lucrezi cu text manual: Combine, GetFileName, GetExtension, GetDirectoryName, ChangeExtension.