This article has been localized into Czech by the community.
MemoryStream
MemoryStream je jednou ze základních tříd Stream, kterou uvidíte poměrně často používanou. Jak název napovídá, pracuje přímo s daty v paměti a často se používá pro manipulaci s bajty pocházejícími z jiného místa, například souboru nebo síťového umístění, bez toho, aby došlo k uzamčení zdroje.
Takže například můžete přečíst celý obsah souboru do MemoryStreamu, který soubor okamžitě zamkne a odemkne, a poté začnete pracovat s bajty v MemoryStreamu. Pokud potřebujete provádět mnoho vyhledávání tam a zpět v bajtech, je to také mnohem rychlejší, než když to samé děláte přímo například ve FileStreamu, protože bajty v MemoryStreamu jsou uloženy v paměti místo na disku.
Proto často uvidíte, že MemoryStream je inicializován s polem bajtů (byte[]) pocházejícími z jiného zdroje, a často uvidíte, že vytvořený MemoryStream je předán dalšímu mechanismu, který MemoryStream využije, například jednomu z typů StreamReader. Zde je příklad:
public void UseMemoryStream()
{
byte[] fileContents = File.ReadAllBytes("test.txt");
using(MemoryStream memoryStream = new MemoryStream(fileContents))
{
using(TextReader textReader = new StreamReader(memoryStream))
{
string line;
while((line = textReader.ReadLine()) != null)
Console.WriteLine(line);
}
}
}
V tomto příkladu přečteme všechny bajty v jednoduchém textovém souboru. Poté vytvoříme MemoryStream s těmito bajty a následně vytvoříme instanci StreamReaderu, který přečte všechny řádky z MemoryStreamu. Jak tento příklad ilustruje, MemoryStream je vhodným zdrojem pro jinou třídu, která provede práci, v tomto případě StreamReader.
Použití tříd StreamReader/StreamWriter je pěknou zkratkou pro práci s podkladovým proudem (Stream), ale pokud trváte na tom, můžete bajty přímo číst z MemoryStreamu a pracovat s nimi. Třída MemoryStream přichází s několika metodami pro toto, například metoda ReadByte(). Přečte bajt na aktuální pozici, vrátí jej a poté posune vlastnost Position, čímž připraví MemoryStream na čtení dalšího bajtu. Zde je příklad:
public void UseMemoryStream()
{
byte[] fileContents = File.ReadAllBytes("test.txt");
using(MemoryStream memoryStream = new MemoryStream(fileContents))
{
int b;
while((b = memoryStream.ReadByte()) >= 0)
Console.WriteLine(Convert.ToChar(b));
}
}
Přečte každý bajt nalezený v MemoryStreamu a vypíše jej do konzole. Všimněte si, že používám metodu Convert.ToChar() k převodu bajtu na ASCII znak, protože vím, že zdroj je prostý text.
Shrnutí
Třída MemoryStream může být použita jako základní zdroj pro data, která chcete udržovat v paměti. To z něj dělá skvělé dočasné úložiště pro data pocházející ze souboru nebo síťového zdroje, aby se předešlo uzamčení atd. během práce s daty.