Stream (proud) v C# je abstrakce pro sekvenční čtení nebo zápis dat. Chová se jako datový kanál, do kterého lze zapisovat nebo z něho číst data po bajtech či blocích.

Pro práci se streamy je poskytnuta abstraktní třída System.IO.Stream, která přináší jednotné API pro různé zdroje dat, například:

  • soubory na disku
  • paměť
  • síťová spojení
  • komprimované soubory

Výhody

  • Nízká paměťová náročnost – data se čtou po částech.
  • Flexibilita – stejný kód funguje pro různé zdroje.
  • Možnost kombinovat streamy – např. komprese přes další stream.

Nevýhody

  • Složitější použití – oproti metodám File.ReadAllText apod.
  • Nutnost správy zdrojů – streamy je třeba správně uzavírat.

Typy streamů

Základní dva typy streamů jsou:

  • MemoryStream
  • FileStream

MemoryStream

  • Stream uložený v operační paměti (RAM).
  • Rychlý, vhodný pro dočasné operace (např. úprava dat před uložením).
  • Velikost limitována dostupnou velikostí operační paměti.
using System;
using System.IO;
 
internal class Program
{
    private static void Main()
    {
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
 
        using (MemoryStream ms = new MemoryStream())
        {
            ms.Write(data, 0, data.Length);
            ms.Position = 0; // Přesun na začátek pro čtení
 
            using (StreamReader reader = new StreamReader(ms))
            {
                string text = reader.ReadToEnd();
                Console.WriteLine(text);
            }
        }
    }
}

Klíčové slovo using

Použití klíčových slov using je v tomto případě extrémně důležité, protože se automaticky zajistí uzavření Streamu a jeho správné odstranění. Více o tomto procesu si lze přečíst Disposable.

FileStream

  • Umožňuje čtení ze souboru a zápis přímo do souboru na disku.
  • Vhodný pro práci s velkými soubory, které nelze uložit celé do paměti.
using System;
using System.IO;
 
internal class Program
{
    private static void Main()
    {
        string path = "test.txt";
        string text = "Ukládám tento text do souboru.";
 
        // Zápis do souboru
        using (FileStream fs = new FileStream(path, FileMode.Create))
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text);
            fs.Write(bytes, 0, bytes.Length);
        }
 
        // Čtení ze souboru
        using (FileStream fs = new FileStream(path, FileMode.Open))
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
 
            string readText = System.Text.Encoding.UTF8.GetString(buffer);
            Console.WriteLine(readText);
        }
    }
}