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.ReadAllTextapod. - Nutnost správy zdrojů – streamy je třeba správně uzavírat.
Typy streamů
Základní dva typy streamů jsou:
MemoryStreamFileStream
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);
}
}
}