TOC

This article is currently in the process of being translated into German (~99% done).

Data Streams:

MemoryStream

Der MemoryStream ist eine der Basis-Streamklassen die Ihnen häufiger begegnen wird. Wie der Name schon sagt, arbeitet er mit Daten direkt im Arbeitsspeicher und wird oft benutzt um externe Datenquellen wie Dateien und Netwerkpfade zu handhaben, ohne diese zu blockieren.

So kann beispielsweise der gesamte Inhalt einer Datei schnell in den Arbeitsspeicher geladen und anschließend mit dem MemoryStream weiter gearbeitet werden. Die Datei wird dabei nur für einen kurzen Moment gesperrt. Wenn Sie außerdem in den Bytes des Streams viel vorwärts und rückwärts suchen müssen ist ein MemoryStream deutlich schneller, da direkt auf den Arbeitsspeicher und nicht auf das Laufwerk zugegriffen wird.

Deshalb werden Sie oft beobachten, dass ein MemoryStream mit einem Bytearray (byte[]) aus einer anderen Quelle initialisiert wird und der initialisierte MemoryStream anschließend an einen anderen Mechanismus wie beispielsweise einen StreamReader weitergegeben wird. Hier ein Beispiel:

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);
		}
	}
}

In diesem Beispiel lesen wir zuerst alle Bytes einer einfachen Textdatei aus. Dann erzeugen wir einen MemoryStream, dem wir die Bytes übergeben. Mithilfe des MemoryStreams erzeugen wir schließlich eine Instanz des StreamReaders, welcher alle Zeilen aus dem MemoryStream ließt. Wie dieses Beispiel gut veranschaulicht, eignet sich ein MemoryStream hervorragend als Hintergrundquelle für eine andere Klasse, welche die eigentliche Arbeit erledigt. In diesem Falle ist die andere Klasse der StreamReader.

Einen StreamReader oder StreamWriter zu verwenden vereinfacht die Arbeit mit dem zugrundeliegenden Stream. Wenn nötig, können Sie allerdings auch direkt mit den Bytes aus dem MemoryStream arbeiten. Die MemoryStream Klasse bietet dafür einige Methoden, wie zum Beispiel ReadByte() an. Diese gibt das Byte an der aktuellen Position im Stream zurück und erhöht die "Position"-Eigenschaft zur Vorbereitung des nächsten Aufrufes um 1.

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));
	}
}

In diesem Beispiel lesen wir jedes Byte einzeln aus dem Stream und geben es in der Konsole aus. Da ich weiß, dass es sich bei der Quelle um einfachen Text handelt, kann ich einfach die Convert.ToChar() Methode verwenden, um das Byte in ein ASCII-Zeichen zu umzuwandeln.

Zusammenfassung

Der MemoryStream eignet sich als Hilfsquelle, um Daten im Arbeitsspeicher zu behalten. Das macht ihn ideal als temporären Speicherort für Daten aus einer Datei oder dem Netzwerk oder um eine Blockierung der Resourcen zu vermeiden.


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!