2013-05-17 43 views
8

In Java und C# gibt es mehrere Klassen zum Puffern von Streams: BufferedStream in C#, Buffered(Input|Output)Stream und Buffered(Reader|Writer).Wie gepufferte Streams funktioniert?

Sie erhalten einige Stream im Konstruktor und implementiert die gleiche Schnittstelle.

Die Frage ist - wie es funktioniert?

Was passiert, wenn ich versuche, ein Byte zu lesen? Es liest viele Bytes in den inneren Puffer und gibt es Byte für Byte an mich zurück. Auf ein Byte schreiben? Schreibt in inneren Puffer und auf flush() schreibt es in den inneren Strom?

Und über das Lesen/Schreiben eines Arrays von Bytes - ist es ineffizient gepuffert, um es auf gepufferten Streams wegen doppelter Kopie Bytes in und von inneren Array zu tun?

Antwort

2

Es liest viele Bytes in inneren Puffer und gibt es dann Byte für Byte zurück zu mir?

Grundsätzlich ja. Es braucht Zeit, um Daten von Plattenplattentellern oder von einem TCP-Datenstrom anzufordern, so dass es effizienter sein kann, einen ganzen Block von Bytes gleichzeitig zu erhalten, anstatt zu versuchen, sie einzeln von der Quelle abzurufen.

+0

Also, gepufferter Stream ist nützlich, wenn ich viele Bytes lesen und sie Byte um Byte lesen will, nicht darüber nachdenken, in Puffer zu lesen? Und ist nutzlos, wenn ich ein Array von Bytes manuell in meinen Puffer lesen möchte? – VorobeY1326

+2

Gepufferter Stream ist nützlich, wenn Ihre Datenquelle einen Anforderungsoverhead hat und Sie die Anzahl der Anfragen begrenzen möchten. Eine Festplatte braucht etwa 1/120 Sekunden, um sich vollständig zu drehen. Wenn Sie also 120 Zeichen von Zeichen zu Zeichen abrufen, kann es im schlimmsten Fall eine ganze Sekunde dauern. Wenn Sie jedoch alle 120 Zeichen gleichzeitig abrufen, können Sie dies in einer einzigen Rotation tun. Sicher, Sie können Ihren eigenen Puffer erstellen, aber warum erfinden Sie das Rad neu? –

+2

Beachten Sie, dass ein FileStream in .NET bereits ausreichend für die Verwendung mit einer Festplatte gepuffert ist. Sie brauchen nur "BufferedStream", wenn Sie TCP-Pakete von einem Socket oder etwas Ähnlichem lesen. –