TOC

This article has been localized into Czech by the community.

Datové proudy (Data Streams):

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.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!