Maison  >  Article  >  Java  >  Comment le mécanisme de mise en mémoire tampon des flux d'E/S Java est-il implémenté ?

Comment le mécanisme de mise en mémoire tampon des flux d'E/S Java est-il implémenté ?

王林
王林original
2024-04-13 15:06:021018parcourir

Le flux d'E/S Java fournit un mécanisme de mise en mémoire tampon via BufferedInputStream et BufferedOutputStream pour améliorer les performances de lecture et d'écriture. BufferedInputStream lit les données du flux d'entrée sous-jacent et les stocke dans un tampon interne, améliorant ainsi les performances lors des lectures fréquentes de petits blocs de données. BufferedOutputStream écrit les données dans un tampon interne et, lorsque le tampon est plein ou doit être vidé immédiatement, dans le flux de sortie sous-jacent, optimisant ainsi les performances pour les écritures peu fréquentes de blocs de données volumineux.

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

Mécanisme de mise en mémoire tampon des flux d'E/S Java

Présentation du mécanisme de mise en mémoire tampon

Les flux d'E/S Java fournissent un mécanisme de mise en mémoire tampon qui améliore la lecture et l'écriture en stockant des blocs de données (tampons) dans les performances de la mémoire. Lors d'une opération sur un tampon, les opérations d'E/S sont effectuées sur le tampon plutôt que directement sur le fichier ou le flux sous-jacent. Cela permet d'économiser les appels système et le temps de changement de contexte.

Implémentation du mécanisme de mise en mémoire tampon

Le mécanisme de mise en mémoire tampon dans les flux d'E/S Java est implémenté en utilisant les flux d'entrée/sortie BufferedInputStream et BufferedOutputStream. Ces flux contiennent des tampons internes pour stocker des blocs de données en mémoire.

BufferedInputStream

BufferedInputStream lit les données et les stocke dans le tampon interne. Lorsque le tampon se remplit, le flux lit un autre bloc de données du flux d'entrée sous-jacent, remplit le tampon et renvoie le premier octet du tampon. Cela améliore les performances lors des lectures fréquentes de petits blocs de données. 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 écrit les données dans un tampon interne. Lorsque le tampon est plein ou que les données doivent être vidées immédiatement, le flux écrit les données du tampon dans le flux de sortie sous-jacent. Cela optimise les performances pour les écritures peu fréquentes sur des blocs de données volumineux, réduisant ainsi le nombre d'appels système. 🎜🎜🎜Exemple pratique🎜🎜🎜Considérez le code suivant, qui utilise BufferedInputStream pour lire dans un fichier texte : 🎜rrreee🎜Dans cet exemple, BufferedInputStream lit les données en morceaux Tampon interne, améliorant ainsi les performances lors des lectures fréquentes de petits blocs de données. 🎜🎜🎜Points à noter🎜🎜
  • La taille du tampon affecte les performances. Des tampons plus grands réduisent le nombre d'appels système, mais consomment également plus de mémoire. 🎜
  • Le tampon pour les classes BufferedInputStream et BufferedOutputStream est spécifié via java.io.BufferedInputStream.DEFAULT_BUFFER_SIZE (la valeur par défaut est de 8 192 octets), vous pouvez remplacer cette valeur lors de la création de l'instance de flux. 🎜
  • Lors de l'utilisation de la méthode flush(), BufferedOutputStream écrira immédiatement les données dans le tampon dans le flux de sortie sous-jacent, tandis que BufferedInputStream Le tampon est vidé lorsque toutes les données sont lues à partir du tampon ou lorsque le flux est fermé. 🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn