Bei der Arbeit mit binären Datenströmen (dh byte[]
Arrays), scheint der Hauptpunkt der Verwendung von BinaryReader
oder BinaryWriter
sein vereinfachtes Lesen/Schreiben von primitiven Datentypen aus ein Stream, unter Verwendung von Methoden wie ReadBoolean()
und unter Berücksichtigung der Codierung. Ist das die ganze Geschichte? Gibt es einen inhärenten Vorteil oder Nachteil, wenn man direkt mit einem Stream
arbeitet, ohne BinaryReader/BinaryWriter
zu verwenden? Die meisten Methoden, wie zum Beispiel Read()
, scheinen in beiden Klassen gleich zu sein, und ich vermute, dass sie darunter identisch funktionieren.Stream.Read() vs BinaryReader.Read() zu verarbeiten Binärströme
Betrachten wir ein einfaches Beispiel eine binäre Datei auf zwei verschiedene Arten der Verarbeitung (edit: Ich weiß, das Art und Weise unwirksam ist und dass ein Puffer verwendet werden kann, ist es nur eine Probe):
// Using FileStream directly
using (FileStream stream = new FileStream("file.dat", FileMode.Open))
{
// Read bytes from stream and interpret them as ints
int value = 0;
while ((value = stream.ReadByte()) != -1)
{
Console.WriteLine(value);
}
}
// Using BinaryReader
using (BinaryReader reader = new BinaryReader(FileStream fs = new FileStream("file.dat", FileMode.Open)))
{
// Read bytes and interpret them as ints
byte value = 0;
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
value = reader.ReadByte();
Console.WriteLine(Convert.ToInt32(value));
}
}
Der Ausgang wird gleich sein, aber was passiert intern (z. B. aus Sicht des Betriebssystems)? Ist es im Allgemeinen wichtig, welche Implementierung verwendet wird? Gibt es einen Zweck, BinaryReader/BinaryWriter
zu verwenden, wenn Sie die zusätzlichen Methoden nicht benötigen, die sie bereitstellen? Für diesen speziellen Fall, sagt MSDN dies in Bezug auf Stream.ReadByte()
:
Die Standardimplementierung auf Stream ist einen neuen Single-Byte-Array und ruft dann lesen. Während dies formal korrekt ist, ist es ineffizient.
Mit GC.GetTotalMemory()
dieser erste Ansatz scheint 2x so viel Platz wie die zweite zuzuteilen, aber AFAIK sollte dies nicht der Fall sein, wenn ein allgemeiner Stream.Read()
Methode verwendet wird (zB für in Stücke Lesen einer mit Puffer). Dennoch scheint es mir, dass diese Methoden/Schnittstellen einfach vereinheitlicht werden könnten ...
Die Standardimplementierung von Stream.ReadByte soll in jeder konkreten Implementierung von Stream übergangen werden. Was lässt die Frage unbeantwortet, warum brauchen wir eine neue StreamReader-Klasse, anstatt uns auf (Implementierungen von) Stream zu verlassen, um das Richtige zu tun? – yoyo
@yoyo, weil die Stream-Klasse im Allgemeinen schlecht entworfen ist. Es ist zu "allgemein". Nicht alle Streams unterstützen das Suchen oder ReadByte (effizient) oder Lesen oder Schreiben. Es ist einfach schlechtes OOP-Design. Sie sollten stattdessen Schnittstellen verwendet haben. –