Frage

1) Wie funktionieren gepufferte Streams im Hintergrund, wie unterscheiden sie sich von normalen Strömen und wie hoch sind die Vorteile, sie zu verwenden?

2) DataInputStream ist auch Byte basierend. Aber es gibt Methoden dazu readLine(). Was macht hier?

War es hilfreich?

Lösung

Aus dem BufferedInputStream Javadoc:

Ein BufferedInputStream verleiht einem anderen Eingangsstrom eine Funktionalität, nämlich die Fähigkeit, die Eingabe zu puffern und die Markier- und Zurücksetzenmethoden zu unterstützen. Wenn der BufferedInputStream erstellt wird, wird ein internes Pufferarray erstellt. Da Bytes aus dem Stream gelesen oder übersprungen werden, wird der interne Puffer nach Bedarf aus dem enthaltenen Eingangsstrom, vielen Bytes jeweils erforderlich. Die Markierung erinnert sich an einen Punkt im Eingangsstrom, und der Reset -Operation führt dazu, dass alle Bytes gelesen werden, seit die jüngste Marke erneut gelesen wird, bevor neue Bytes aus dem enthaltenen Eingangsstrom entnommen werden.

Intern wird ein Pufferarray verwendet, und anstatt Bytes einzeln aus dem zugrunde liegenden Eingabestream zu lesen, werden genügend Bytes gelesen, um den Puffer zu füllen. Dies führt im Allgemeinen zu einer schnelleren Leistung, da auf dem zugrunde liegenden Eingangsstrom weniger Lesevorgänge erforderlich sind.

Das Gegenteil gilt dann für gepufferte Ausgabestream.

mark () und reset () können wie folgt verwendet werden:

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

Marke zu erklären/noch etwas zurückzusetzen ...

Der Bufferinputstream erinnert sich intern an die aktuelle Position im Puffer. Während Sie Bytes lesen, wird die Position zunehmen. Ein Aufruf zur Markierung (10) speichert die aktuelle Position. Nachfolgende Aufrufe zum Lesen werden die aktuelle Position weiter erhöht, aber ein Aufruf zum Zurücksetzen wird die aktuelle Position wieder auf seinen Wert festlegen, wenn Mark aufgerufen wurde.

Das Argument zu Mark gibt an, wie viele Bytes Sie lesen können, nachdem die Marke aufgerufen werden kann, bevor die Markierungsposition ungültig wird. Sobald die Markierungsposition ungültig ist, können Sie nicht mehr Reset anrufen, um dorthin zurückzukehren.

Wenn beispielsweise Mark (2) in Zeile 4 über einer IOException verwendet worden wäre, wenn reset () in Zeile 6 bezeichnet wird, da die Markposition ungültig wurde, da wir mehr als 2 Bytes lesen.

Andere Tipps

Gepufferte Leser/Autoren/InputStreams/OutputStreams lesen und schreiben in große Stücke zur Optimierung an das Betriebssystem. Im Falle von Schriftstellern und OutputStreams werden die Daten im Speicher gepuffert, bis genügend gesammelt wird, um ein großes Stück zu schreiben. Bei Lesern und InputStreams wird ein großer Stück Lesebildscheibe/... in den Puffer gelesen, und alle Lesevorgänge werden aus diesem Puffer durchgeführt, bis der Puffer leer ist und ein neuer Stück gelesen wird.

DataNputStream basiert tatsächlich Byte. Die Readline -Methode ist veraltet. Intern liest es Bytes von Disk/Network/... Byte-for-Byte, bis es eine komplette Linie gesammelt hat. Dieser Stream könnte also durch Verwendung eines BufferedInputStream als Quelle beschleunigt werden, so dass die Bytes für die Zeile aus dem In-Memory-Puffer anstelle direkt von der Festplatte gelesen werden.

Bei nicht gepufferter E/A wird jede Lese- oder Schreibanforderung direkt an das Betriebssystem übergeben. Javas gepufferte E/A -Streams lesen und schreiben Daten in ihren eigenen Speicherpuffer (normalerweise ein Byte -Array). Anrufe zum Betriebssystem werden nur getätigt, wenn der Puffer leer ist (bei Lesevorgängen) oder der Puffer voll (bei Schreibvorgängen). Es ist manchmal eine gute Idee, den Puffer nach kritischen Punkten in Ihrer Anwendung manuell zu spülen.

Da die API -Aufrufe des Betriebssystems zu Datenträgerzugriff, Netzwerkaktivitäten und dergleichen führen können, kann dies ziemlich teuer sein. Verwenden von Puffern, um das native Betriebssystem -E/A in größere Stücke zu stapeln, verbessert die Leistung häufig signifikant.

Gepufferte Streams schreiben oder lesen Daten in größeren Stücken von - Nomen Est Omen - Pufferung. Abhängig vom zugrunde liegenden Strom kann dies die Leistung dramatisch erhöhen.

Aus Java.io.BuffenedoutputStreamJavadocs:

Durch das Einrichten eines solchen Ausgabestreams kann eine Anwendung Bytes in den zugrunde liegenden Ausgabestrom schreiben, ohne notwendigerweise einen Aufruf des zugrunde liegenden Systems für jedes geschriebene Byte zu verursachen.

Um diese Art von Gemeinkosten zu reduzieren, implementiert die Java -Plattform gepufferte E/A -Streams. Geschützte Eingabestreams lesen Daten aus einem Speicherbereich, der als Puffer bekannt ist. Die native Eingangs -API wird nur aufgerufen, wenn der Puffer leer ist. In ähnlicher Weise schreiben gepufferte Ausgangsströme Daten in einen Puffer, und die native Ausgangs -API wird nur aufgerufen, wenn der Puffer voll ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top