Heim  >  Artikel  >  Java  >  Wie wird der Puffermechanismus von Java-I/O-Streams implementiert?

Wie wird der Puffermechanismus von Java-I/O-Streams implementiert?

王林
王林Original
2024-04-13 15:06:021018Durchsuche

Der Java-E/A-Stream bietet einen Puffermechanismus über BufferedInputStream und BufferedOutputStream, um die Lese- und Schreibleistung zu verbessern. BufferedInputStream liest Daten aus dem zugrunde liegenden Eingabestream und speichert sie in einem internen Puffer, wodurch die Leistung bei häufigen Lesevorgängen kleiner Datenblöcke verbessert wird. BufferedOutputStream schreibt Daten in einen internen Puffer und, wenn der Puffer voll ist oder sofort geleert werden muss, in den zugrunde liegenden Ausgabestream, wodurch die Leistung für seltene Schreibvorgänge großer Datenblöcke optimiert wird.

Java I/O流的缓冲机制是如何实现的?

Puffermechanismus von Java-I/O-Streams

Überblick über den Puffermechanismus

Java-I/O-Streams bieten einen Puffermechanismus, der das Lesen und Schreiben durch das Speichern von Datenblöcken (Puffer) in der Speicherleistung verbessert. Bei der Arbeit an einem Puffer werden E/A-Vorgänge am Puffer und nicht direkt an der zugrunde liegenden Datei oder dem zugrunde liegenden Stream ausgeführt. Dadurch werden Systemaufrufe und Kontextwechsel eingespart.

Implementierung des Puffermechanismus

Der Puffermechanismus in Java-E/A-Streams wird mithilfe der Eingabe-/Ausgabestreams BufferedInputStream und BufferedOutputStream implementiert. Diese Streams enthalten interne Puffer zum Speichern von Datenblöcken im Speicher.

BufferedInputStream

BufferedInputStream liest Daten ein und speichert sie im internen Puffer. Wenn der Puffer voll ist, liest der Stream einen weiteren Datenblock aus dem zugrunde liegenden Eingabestream, füllt den Puffer und gibt das erste Byte im Puffer zurück. Dies verbessert die Leistung bei häufigen Lesevorgängen kleiner Datenblöcke. BufferedInputStream 读入数据并存储在内部缓冲区中。当缓冲区填满时,流会从底层输入流中读取另一个数据块,填充缓冲区,并返回缓冲区中的第一个字节。这提高了对小数据块频繁读取的性能。

BufferedOutputStream

BufferedOutputStream 将数据写入内部缓冲区。当缓冲区已满或者需要立即刷新数据时,流将缓冲区中的数据写入底层输出流。这优化了对大数据块的不频繁写入的性能,减少了系统调用的数量。

实战案例

考虑以下代码,它使用 BufferedInputStream 读入一个文本文件:

try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt"))) {
    byte[] buf = new byte[1024];
    int bytesRead;

    while ((bytesRead = in.read(buf)) != -1) {
        System.out.write(buf, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}

在此示例中,BufferedInputStream 将数据分块读入内部缓冲区,从而提高了对小数据块频繁读取的性能。

需要注意的点

  • 缓冲区大小会影响性能。较大的缓冲区可以减少系统调用的数量,但也会消耗更多的内存。
  • BufferedInputStreamBufferedOutputStream 类的缓冲区是通过 java.io.BufferedInputStream.DEFAULT_BUFFER_SIZE (默认为 8192 字节)指定的,您可以在构建流实例时覆盖此值。
  • 当使用 flush() 方法时,BufferedOutputStream 会立即将缓冲区中的数据写入底层输出流,而 BufferedInputStream
BufferedOutputStream🎜🎜🎜BufferedOutputStream schreibt Daten in einen internen Puffer. Wenn der Puffer voll ist oder die Daten sofort geleert werden müssen, schreibt der Stream die Daten im Puffer in den zugrunde liegenden Ausgabestream. Dies optimiert die Leistung bei seltenen Schreibvorgängen in große Datenblöcke und reduziert die Anzahl der Systemaufrufe. 🎜🎜🎜Praktisches Beispiel🎜🎜🎜Betrachten Sie den folgenden Code, der BufferedInputStream zum Einlesen einer Textdatei verwendet: 🎜rrreee🎜In diesem Beispiel liest BufferedInputStream die Daten in Blöcken Interner Puffer, wodurch die Leistung bei häufigen Lesevorgängen kleiner Datenblöcke verbessert wird. 🎜🎜🎜Zu beachtende Punkte🎜🎜
  • Puffergröße beeinflusst die Leistung. Größere Puffer reduzieren die Anzahl der Systemaufrufe, verbrauchen aber auch mehr Speicher. 🎜
  • Der Puffer für die Klassen BufferedInputStream und BufferedOutputStream wird über java.io.BufferedInputStream.DEFAULT_BUFFER_SIZE angegeben (Standard ist 8192 Bytes), Sie können diesen Wert beim Erstellen der Stream-Instanz überschreiben. 🎜
  • Bei Verwendung der Methode flush() schreibt BufferedOutputStream die Daten im Puffer sofort in den zugrunde liegenden Ausgabestream, während BufferedInputStream Der Puffer wird geleert, wenn alle Daten aus dem Puffer gelesen wurden oder wenn der Stream geschlossen wird. 🎜🎜

Das obige ist der detaillierte Inhalt vonWie wird der Puffermechanismus von Java-I/O-Streams implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn