Dateien und Streams: StreamWriter und StreamReader

In C# gibt es zusätzlich zum FileStream noch einige andere Klassen, mit welchem ein Dateizugriff möglich ist. Hier wollen wir nun noch die Klassen StreamWriter und StreamReader vorstellen, welche in C# sehr gerne eingesetzt werden. Dabei kann der StreamWriter ausschließlich zum Schreiben verwendet werden, wohingegen der StreamReader nur für Lesezugriffe geeignet ist.
Der Konstruktor der StreamWriter-Klasse benötigt als Übergabeparameter den Dateinamen. Als zweiter Parameter kann ein bool-Wert übergeben werden, der angibt, ob Daten an die Datei angehängt werden sollen (true = anhängen, false = überschreiben). Unabhängig vom zweiten Parameter (also egal ob true, false oder nicht angegeben), wird die Datei immer erstellt, falls diese nicht vorhanden ist. Die Funktionen zum Schreiben sind ähnlich aufgebaut wie die Ein- und Ausgabe-Funktionen der Konsole, d. h. es gibt die Write()- und WriteLine()-Funktion, welche mehrfach überladen ist. Dadurch fällt der Zugriff auf den Inhalt der Datei einfacher als mit dem FileStream, da dort erst eine Konvertierung in ein byte-Array notwendig ist. Der StreamWriter verfügt wie der FileStream auch über die Funktionen Flush() und Close().
Dem StreamReader wird im Konstruktor der Dateiname übergeben. Um Daten aus der Datei zu lesen, gibt es die Funktionen Peek(), Read(), ReadLine() und ReadToEnd(). Peek() und Read() geben den Code eines einzelnen eingelesenen Zeichens zurück (abhängig von der Codierung). Dieser Code kann dann z. B. in ein char gecastet werden. Der Unterschied zwischen Peek() und Read() kann wie folgt erklärt werden: Beim Lesen aus einer Datei wird normalerweise der Lesezeiger um eine Position vorgesetzt. Peek() hingegen verändert die Position des Lesezeigers jedoch nicht. ReadLine() liest bis zu einem Zeilenumbruch und liefert eine Zeichenkette zurück. ReadToEnd() gibt ebenfalls eine Zeichenkette zurück, liest jedoch die komplette Datei ein. Da es sich beim StreamReader, wie der Name schon verrät, um einen Stream handelt, muss dieser ebenfalls mit Close() geschlossen werden.
Nachdem Sie nun drei verschiedene Möglichkeiten für Dateizugriffe kennen, müssen Sie selbst entscheiden, welche Methode am einfachsten für den spezifischen Anwendungsfall Ihres eigenen Programms geeignet ist. Um eine Datei am Stück zu schreiben oder zu lesen, eignet sich die statische Klasse File am besten. Für einen etwas erweiterten Text basierenden Dateizugriff eignet sich StreamWriter und StreamReader. Falls der Dateizugriff komplexer wird (z. B. Dateizeiger setzen) sollte der FileStream verwendet werden.

Program.cs

const string sDateiname = "test.txt";
StreamWriter oWrite = null;
StreamReader oRead = null;

try
{
	// Daten in Datei schreiben
	oWrite = new StreamWriter(sDateiname, false);  // false = kein Append (anhängen)
	oWrite.WriteLine("Hallo-Welt!");
	oWrite.WriteLine();
	oWrite.Write("C#-Buch V2.0 5.5");       // Write() erzeugt keinen Zeilenumbruch am Ende
	oWrite.Close();
}
catch (Exception ex)
{
	Console.WriteLine(ex.ToString());
	Console.ReadKey();
	return;
}
finally
{
	// Daten schreiben und Stream schließen
	if (oWrite != null)
		oWrite.Close();
}

try
{
	// Datei auslesen und auf der Konsole ausgeben
	oRead = new StreamReader(sDateiname);
	while (oRead.Peek() != -1)
		Console.WriteLine(oRead.ReadLine());
}
catch (Exception ex)
{
	Console.WriteLine(ex.ToString());
}
finally
{
	// Stream schließen
	if (oRead != null)
		oRead.Close();
}

Console.ReadKey();
Download

LinksRechts