TOC

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

Data Stromen (Streams):

MemoryStream

De MemoryStream is een van de basale Stream classes die vaak gebruikt wordt. Hij verwerkt data in het geheugen, zoals de naam impliceert en wordt vaak gebruikt om bytes te verwerken die van een ander plaats komen, bv. een bestand of een network locatie, zonder de bron te blokkeren.

Je zou dus bijvoorbeeld de hele inhoud van een bestand kunnen inlezen in een MemoryStream, die het bestand onmiddellijk sluit en weer opent, en dan gaan werken aan de bytes in een MemoryStream. Als je vaak heen en weer moet zoeken in de bytes, gaat dit veel sneller dan hetzelfde direct in bv. een FileStream doen, omdat de bytes in een MemoryStream worden opgeslagen in het geheugen in plaats van op de schijf.

Daarom zie je vaak dat een MemoryStream wordt geïnitialiseerd met een array van bytes (byte[]) die van een andere bron komen. Vaak zul je zien dat de geïnstantieerde MemoryStream wordt doorgeschoven naar een ander mechanisme dat de MemoryStream zal gebruiken, bv. één van de Streamreader typen. Hier is een voorbeeld:

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 dit voorbeeld lezen we alle bytes in een simpel tekstbestand. Dan creëren we een MemoryStream met deze bytes en dan creëren we een StreamReader die alle regels van de MemoryStream zal lezen. Zoals dit voorbeeld illustreert, is de MemoryStream een prima hulpbron voor een andere class die het werk zal doen, in dit geval de StreamReader.

Using the StreamReader/StreamWriter classes is a nice shortcut to work with the underlying Stream, but if you insist, you can read the bytes directly out of the MemoryStream and work with them. The MemoryStream class comes with several methods for this, e.g. the ReadByte() method. It will read the byte at the current position, return it and then advance the Position property, preparing the MemoryStream for reading the next byte. Here's an example:

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

Hij leest elke byte die hij kan vinden in de MemoryStream en drukt ze af naar de Console. let op dat ik de Convert.ToChar() method gebruik om de byte om te zetten in een ASCII karakter omdat ik weet dat de bron uit louter tekst bestaat.

Samenvatting

De MemoryStream class kan gebruikt worden als hulpbron voor data die je in het geheugen wilt houden. Dit levert een geweldige tijdelijke opslag voor data die vanuit een bestand komen of vanuit een netwerk bron, om blokkering te voorkomen terwijl je met de data aan het werk bent.