In diesem Blog schreibe ich über Streams in C#. Stream ist eine abstract class in C#, die von verschiedene andere Klassen vererbt wird. Stream hatte ich im C# Buch Head First als Kapitel und habe dort nur den FileStream kennengelernt. Ich schreibe hier für was Stream benutzt wird und über die subclasses von Stream.
Stream ist, wie bereits gesagt, eine abstract class und bietet die grundlegenden Methoden zum Umgang mit dem Datenstream, mit denen man Bytes zum speichern der Daten überträgt. Stream ist kurz beschrieben eine Zeile von aufeinanderfolgender byte. Da es eine abstract class ist, kann man es nicht instanziieren, doch seine subclasses schon. Stream hat viele subclasses, doch die am meisten genutzten sind: FileStream, BufferedStream, MemoryStream, NetworkStream, GZipStream und CryptoStream.

Da Stream IDisposable implementiert, machen es die subclasses automatisch auch. IDisposable ist eine Interface, um sein Objekt mit der Dispose() Methode zu entsorgen.
FileStream wird benutzt, um Daten in Files zu speichern und sie auch ablesen zu können. Dazu werden die Daten in byte array angegeben und mit der Write() Methode ins File als byte gespeichert. Wenn man die Daten auslesen will, benutzt man die Read() Methode. Die herausgelesene Daten speichern sich im byte array. Es gibt noch die Klasse IsolatedStorageFileStream, die FileStream erbt. Sie benutzt files im Isolated Storage, Bereich einer Festplatte, der nur für bestimmte Anwendung zur verfügung steht.
Der BufferedStream dient dazu da, anderen Streams die Performance/Leistungen zu verbessern. Dazu muss er einen anderen Stream einpacken. Er kann bei write und read benutzt werden aber nicht für beide gleichzeitig.
Gibt man dem BufferedStream bspw. ein FileStream Objekt im Konstruktor und evtl. ein Default-Puffer Wert (standardmäßig 4096 bytes), kann er Daten packen, bis er voll ist. Wenn dies passiert, werden die Daten mit der Flush() Methode automatisch ins File gestossen. Mit dieser Variante verbessert man die Programmleistung.
Der MemoryStream ist ein Stream, deren Daten auf dem Speicher gelagert werden, statt files oder Netzwerk Verbindungen zu benutzen. Die Daten werden alle als unsigned byte arrays gespeichert.
NetworkStream stellt eine Verbindung mit Sockets her. Um das selber auszutesten, bräuchte man zwei Programme: Einen für den Server und einen für den Client. Der Client versucht eine Verbindung zum Server mit der IP-Adresse und Port herzustellen, während der Server nach Clients mit den Angaben sucht. Falls es ein Client findet und alles in Ordnung ist, nimmt der Server die Verbindung auf und der Client kann nun mit dem Server kommunizieren und Viceversa.
Der GZipStream komprimiert die Daten. Er speichert die Daten effizient in bspw. komprimierten Log Files. Somit braucht es weniger Speicherplatz um viele grosse Daten zu speichern.
Der CryptoStream bietet einen Applikation die Möglichkeit, Daten eines anderen Stream zu entschlüsseln und verschlüsseln. Um CryptoStream effektiv zu nutzen, muss man mit der Kryptographie verwandt sein. Bei der Verschlüsselung und Entschlüsselung gibt es zwei verschiedene Techniken, die Symmetrisch und Asymmetrische. Bei der symmetrischen Methode benutzt man einen sicheren Schlüssel um die Daten zu ver- und entschlüsseln: den private key. Bei der Asymmetrische Methode benutzt man einen öffentlichen Schlüssel, den public key, um die Daten zu verschlüsseln und einen private key um die Daten zu entschlüsseln. Welche Methode man wählt ist deren Entscheidung. Die Asymmetrische Methode ist viel sicherer, ist aber im vergleich zum symmetrischen viel langsamer und aufgrund ihrer längeren Schlüssellängen benötigt es viel mehr Rechenleistung. Die Symmetrische Methode ist viel unsicherer, jedoch sehr schnell und benötigt weniger Rechenleistung.

Quelle:
Bild1: Stream Class
Bild2 : Asymmetrische Methode