StreamReader și StreamWriter în C# (.NET)

.NET BCL și CLI-ul dotnet .NET Framework 1.0

Citesc și scriu text dintr-un fișier sau stream, linie cu linie, fără să încarce tot fișierul în memorie.

Sintaxă C#
using var w = new StreamWriter(cale, append: true);   using var r = new StreamReader(cale);   r.ReadLine()

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ă using sau Dispose: 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 (bloc using separat).
  • new StreamWriter(cale) suprascrie fișierul existent; pentru adăugare dă append: true.

Comenzi înrudite