Aus der Javadoc von BufferedInputStream:
Ein BufferedInputStream fügt einem anderen Eingabestrom Funktionen hinzu, nämlich die Fähigkeit, die Eingabe zu puffern und die Markierungs- und Rücksetzmethoden zu unterstützen. Wenn der BufferedInputStream erstellt wird, wird ein internes Puffer-Array erstellt. Wenn Bytes aus dem Stream gelesen oder übersprungen werden, wird der interne Puffer nach Bedarf aus dem enthaltenen Eingabestrom aufgefüllt, und zwar viele Bytes auf einmal. Die Markierungsoperation merkt sich einen Punkt im Eingabestrom, und die Reset-Operation bewirkt, dass alle seit der letzten Markierungsoperation gelesenen Bytes erneut gelesen werden, bevor neue Bytes aus dem enthaltenen Eingabestrom entnommen werden.
Intern wird ein Puffer-Array verwendet, und anstatt einzelne Bytes aus dem zugrunde liegenden Eingabestrom zu lesen, werden so viele Bytes gelesen, dass der Puffer gefüllt wird. Dies führt im Allgemeinen zu einer schnelleren Leistung, da weniger Lesevorgänge im zugrunde liegenden Eingabestrom erforderlich sind.
Das Gegenteil gilt dann für BufferedOutputStream.
mark() und reset() könnten 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
Um Markierung/Rückstellung näher zu erklären...
Der BufferInputStream merkt sich intern die aktuelle Position im Puffer. Wenn Sie Bytes lesen, wird die Position erhöht. Ein Aufruf von mark(10) speichert die aktuelle Position. Nachfolgende Aufrufe von read erhöhen die aktuelle Position weiter, aber ein Aufruf von reset setzt die aktuelle Position auf den Wert zurück, den sie beim Aufruf von mark hatte.
Das Argument für mark gibt an, wie viele Bytes Sie nach dem Aufruf von mark lesen können, bevor die Markierungsposition ungültig wird. Sobald die Markierungsposition ungültig geworden ist, können Sie nicht mehr reset aufrufen, um zu ihr zurückzukehren.
Wenn beispielsweise mark(2) in Zeile 4 verwendet worden wäre, würde beim Aufruf von reset() in Zeile 6 eine IOException ausgelöst, da die Markierungsposition ungültig geworden wäre, da wir mehr als 2 Bytes gelesen haben.