Question

1) Comment le cours d'eau mises en mémoire tampon fonctionnent en arrière-plan, comment diffèrent-ils des flux normaux et quels sont les avantages (s) de les utiliser?

2) DataInputStream est Byte base. Mais il a des méthodes pour readLine(). Quel est le point ici?

Était-ce utile?

La solution

De la javadoc BufferedInputStream:

  

A BufferedInputStream ajoute des fonctionnalités à un autre flux d'entrée, à savoir, la capacité de mémoire tampon d'entrée et pour soutenir la marque et réinitialisation méthodes. Lorsque le BufferedInputStream est créé, un tableau de mémoire tampon interne est créé. Comme octets du flux sont lues ou ignorées, la mémoire tampon interne est rempli, si nécessaire à partir du courant d'entrée contenu, le nombre d'octets à la fois. L'opération de marque se souvient d'un point dans le flux d'entrée et l'opération de remise à zéro provoque tous les octets lus depuis la dernière opération de la marque à relues avant de nouveaux octets sont prises à partir du flux d'entrée contenu.

en interne une matrice de tampon est utilisé au lieu de lire et d'octets individuellement à partir du flux d'entrée sous-jacente assez d'octets sont lus à remplir la mémoire tampon. Il en résulte généralement des performances plus rapides que moins lectures sont nécessaires sur le flux d'entrée sous-jacente.

Le contraire est donc vrai pour BufferedOutputStream.

marque () et reset () peut être utilisé comme suit:

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

Pour expliquer marque / reset un peu plus ...

Le BufferInputStream souvient intérieurement la position actuelle dans la mémoire tampon. En lisant octets la position incrémente. Un appel à marquer (10) va enregistrer la position actuelle. Les appels ultérieurs à lire continuera à augmenter la position actuelle mais un appel à réinitialisation définir la position actuelle à sa valeur quand marque a été appelée.

L'argument pour marquer indique le nombre d'octets que vous pouvez lire après la marque d'appel avant que la position de la marque s'invalidée. Une fois la position de la marque, vous ne pouvez plus appeler est invalidée remise à revenir.

Par exemple, si la marque (2) avait été utilisé dans la ligne 4 d'une IOException serait levée lors de la réinitialisation () est appelée sur la ligne 6 que la position de la marque aurait été invalidée puisque nous lisons plus de 2 octets.

Autres conseils

tamponnées Lecteurs / Auteurs / InputStreams / OutputStreams lire et écrire sur le système d'exploitation en gros morceaux pour l'optimisation. En cas d'écrivains et OutputStreams, les données sont mises en mémoire tampon jusqu'à ce qu'il y est suffisamment collecté pour écrire un gros morceau. En cas de lecteurs et InputStreams, une grande partie est lu sous forme de disque / réseau / ... dans la mémoire tampon et toutes les lectures sont faites à partir de ce tampon jusqu'à ce que le tampon est vide, et un nouveau morceau est lu.

DataInputStream est en effet octet basé. La méthode de readLine est obsolète. En interne, il lit octets à partir du disque / réseau / ... octet par octet jusqu'à ce qu'il ait recueilli une ligne complète. Donc, ce flux pourrait être accéléré en utilisant un BufferedInputStream comme sa source, de sorte que les octets de la ligne sont lues à partir du tampon à la place en mémoire de directement à partir du disque.

Avec un tampon E / S chaque demande de lecture ou d'écriture est envoyé directement au système d'exploitation. Les flux d'E / S mises en mémoire tampon de Java lire et écrire des données à leur propre mémoire tampon (habituellement un tableau d'octets). Les appels vers le système d'exploitation ne sont effectués que lorsque la mémoire tampon est vide (en faisant lit) ou le tampon est plein (lorsque vous faites écrit). Il est parfois une bonne idée de vider manuellement le tampon après les points critiques dans votre application.

Étant donné que les appels API du système d'exploitation peut entraîner l'accès au disque, l'activité du réseau et autres, cela peut être assez cher. En utilisant des tampons pour le lot natif du système d'exploitation d'E / S en gros morceaux améliore souvent considérablement les performances.

flux tamponnées écrire ou lire des données dans les grands morceaux par - nomen est omen - . En fonction du flux sous-jacent, ce qui peut augmenter considérablement les performances.

De java.io.BufferedOutputStream 's Javadocs:

  

En mettant en place un tel flux de sortie,   une application peut écrire octets à la   flux de sortie sous-jacente sans   causant nécessairement un appel à la   système sous-jacent pour chaque octet   écrit.

Pour réduire ce genre de frais généraux, la plate-forme Java implémente les flux E / S tamponne. entrée tamponné flux de données lues à partir d'une zone de mémoire connu sous le nom d'un tampon; l'API d'entrée native est appelée uniquement lorsque la mémoire tampon est vide. De même, les courants de sortie mises en mémoire tampon des données d'écriture dans une mémoire tampon, et l'API de sortie native est appelée que lorsque le tampon est plein.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top