BufferedInputStream IO tamponné et lecture (octet [] b) dans InputStream

InputStream
InputStream est la classe de niveau supérieur de tous les flux d'entrée, bien sûr uniquement définie, non implémentée, l'implémentation spécifique par sous-classes, comme AudioInputStream, ByteArrayInputStream, FileInputStream, etc.
Il indique l'implémentation de la lecture de inputStream (byte [], int off, int len), qui consiste simplement à appeler la méthode read (), et la méthode read () consiste à lire un seul octet à la fois, et à l'appeler toujours à chaque fois Le système sous-jacent, donc InputStream read (byte [], int off, int len) est identique à l'appel direct de read (), le buffer byte [] est ici. Par conséquent, il est recommandé que les sous-classes fournissent un meilleur moyen de remplacer la méthode read (byte [], int off, int len).
Les
deux méthodes read () de FileInputStream sont implémentées dans des méthodes locales, car FileInputStream interagit avec le système d'exploitation sous-jacent, et il n'y a pas de performances meilleures et plus faciles que l'utilisation de méthodes locales. Par conséquent, les recommandations du troisième paragraphe sont adoptées ici et la fonction de cache est vraiment implémentée, bien que nous ne sachions pas comment l'implémenter.
Alors maintenant que FileInputStream a implémenté la mise en cache pour améliorer les performances, à quoi sert BufferedInputStream?
BufferedInputStream
ajoute des fonctionnalités à un autre flux d'entrée, à savoir l'entrée tamponnée et la possibilité de prendre en charge les méthodes de marquage et de réinitialisation. Lors de la création d'un BufferedInputStream, un tableau de tampons internes est créé. Lors de la lecture ou du saut d'octets dans le flux, le tampon interne peut être à nouveau rempli à partir du flux d'entrée inclus selon les besoins, avec plusieurs octets à la fois. L'opération de marquage enregistre un certain point dans le flux d'entrée et l'opération de réinitialisation provoque la lecture de tous les octets lus depuis la dernière opération de marquage avant de récupérer de nouveaux octets dans le flux d'entrée inclus.

En fait, "l'entrée tamponnée" mentionnée ci-dessus n'utilise pas vraiment la méthode locale pour améliorer les performances comme FileInputStream, mais signifie que sur cette base, pour la commodité des programmeurs, un tampon (octet [1024 * 8] est fourni en interne buf), et décoré la classe FileInputStream (lors de la construction de BufferedInputStram doit fournir le InputStream décoré peut être vu).
Lorsque vous utilisez FileInputStream, read () lit un octet par le bas, read (byte [], int off, int len) lit len-off octets à la fois, nous devons fournir un octet [] Pour stocker,
et lorsque vous utilisez BufferedInputStream, son read () est en fait identique à read (byte [], int off, int len), en interne, il appelle read (byte [], int off, int len) de FileInputStream qui construit l'entrée Méthode, lisez les données sous-jacentes dans l'octet [] et l'octet [] n'a pas besoin de nous pour fournir, la classe elle-même définit un tableau buf d'octets [] pour stocker ces données, donc si vous utilisez BufferedInputStream notre programme n'a pas besoin Pour les opérations du tableau d'octets [], écrivez-le simplement comme ceci:

FileInputStream fis=new FileInputStream("d:\\a.txt");  
BufferedInputStream bis=new BufferedInputStream(fis);  
int data=0;  
while((data=bis.read())!=-1){  
    //......          
}  

De cette façon, bien qu'un octet soit lu à la fois, au lieu de lire les données de la couche inférieure à chaque fois, le système sous-jacent est appelé à la fois pour lire jusqu'à octets buf.length dans le tableau buf, puis lire un octet à partir de buf , Réduisant la surcharge des appels fréquents à l'interface sous-jacente.
Si la lecture (octet [], int off, int len) de BufferedInputStream est utilisée, le tampon sera servi par l'octet entrant [] (bien que buf soit parfois utilisé en interne, mais les performances sont l'utilisation de l'entrée octet [] dans la mémoire tampon).

Cela dit, dois-je utiliser FileInputStream ou BufferedInputStream si je veux le mettre en mémoire tampon? Pour revenir au texte violet ci-dessus, BufferedInputStream ne fournit pas principalement de buf, mais encapsule les fonctions de mise en mémoire tampon et de marquage / relecture. Si vous n'avez pas besoin d'utiliser la fonction mark / readback et que vous n'utilisez pas le tableau de tampons au milieu, il est évident que l'utilisation directe de FileInputStream en lecture (octet [], int off, int len) est la plus efficace.

Enfin, pourquoi utiliser les performances de mise en mémoire tampon est meilleur, car l'application peut écrire plusieurs octets dans le flux de sortie sous-jacent (lecture native (octet)), sans avoir à appeler le système sous-jacent pour chaque écriture d'octets (lecture native ()). Le principe de OutputStream est fondamentalement le même, donc je n'en parlerai pas ici.

Publié 16 articles originaux · loué 0 · visites 844

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45830683/article/details/103101471
conseillé
Classement