web-dev-qa-db-fra.com

Quelle est la taille du tampon dans BufferedReader?

Quel est le sens de la taille du tampon dans le constructeur?

BufferedReader(Reader in, int size)

Comme j'ai écrit le programme:

import Java.io.*;
class bufferedReaderEx{
    public static void main(String args[]){
        InputStreamReader isr = null;
        BufferedReader br = null;
            try{
                isr = new InputStreamReader(System.in);
//              System.out.println("Write data: ");
//              int i = isr.read();
//              System.out.println("Data read is: " + i);
                //Thus the InputStreamReader is useful for reading the character from the stream
                System.out.println("Enter the data to be read by the bufferedReader: ");
                //here isr is containing the lnefeed already so this is needed to be flushed.
                br = new BufferedReader(isr, 2);
                String str = br.readLine();
                System.out.println("The data is : :" +  str);
            }catch(IOException e){
                System.out.println("Can't read: " + e.getMessage());
            }
    }
}

Production:

Enter the data to be read by the bufferedReader: Hello world and hello world again
The data is: Hello world and hello world again

Alors qu'est-ce que la taille du tampon signifie que je voulais qu'il ne lise que deux caractères. mais ce n'était pas ça.

24
codeomnitrix

BufferedReader met en mémoire tampon l'entrée, comme son nom l'indique. Cela signifie qu'il lit à partir de la source d'entrée dans un tampon avant de le passer sur vous. La taille de la mémoire tampon se réfère ici au nombre d'octets qu'elle met en mémoire tampon.

La lecture des entrées de la plupart des sources est très lente. Un tampon de seulement 2 octets va nuire aux performances, car votre programme attendra très probablement en entrée la plupart du temps. Avec une taille de tampon de 2, une lecture de 100 octets entraînera la lecture de 2 octets dans le tampon en mémoire (très rapide), le remplissage du tampon (très lent), la lecture de 2 octets dans le tampon (très rapide), le remplissage du tampon (très lent), etc. - globalement très lent. Avec une taille de tampon de 100, une lecture de 100 octets entraînera la lecture de 100 octets à partir du tampon en mémoire (très rapide) - globalement très rapide. Cela suppose que le tampon contient les 100 octets lors de la lecture, ce qui, dans un cas comme le vôtre, est une hypothèse raisonnable à faire.

À moins que vous ne sachiez ce que vous faites, vous devez utiliser la taille de tampon par défaut qui est assez grande. Une raison pour un tampon plus petit est lorsque vous exécutez sur un périphérique à mémoire limitée, car le tampon consomme de la mémoire.

34
moinudin

http://www.docjar.com/html/api/Java/io/BufferedReader.Java.html

Selon cette Java, la taille du tampon par défaut est de 8192 caractères. La taille de la ligne est considérée comme une capacité de 80 caractères.

La taille de la mémoire tampon 8192 est suffisante pour les fichiers de plus petite taille. Mais encore une fois, cela peut se développer. si le fichier contient plus de 8192 caractères, la méthode fill de bufferedreader augmentera la taille du tampon avant de lire le contenu du fichier. Pour les fichiers de contenu plus volumineux, définissez de préférence votre propre taille maximale sur tampon tout en créant un lecteur tamponné via le constructeur, afin que vous puissiez éviter de recréer de la mémoire et de copier l'ancien tableau dans le tableau nouvellement créé.

11
user1923551

Lorsque vous lisez ou écrivez dans un fichier, vous devez accéder au noyau, qui a en fait accès au fichier. Toutes les opérations sur les fichiers doivent passer par le noyau. Il s'agit d'une opération assez coûteuse. La mise en mémoire tampon provoque la lecture d'un bloc d'octets; ceux-ci sont conservés dans un emplacement temporaire dans RAM et sont des octets sont lus à partir de cet emplacement. De cette façon, vous ne faites pas de requêtes fréquentes du noyau pour faire le fichier IO.

Si vous utilisez une énorme taille de mémoire tampon, vous monopoliserez RAM inutilement. Si vous en utilisez une toute petite, vous boguez constamment le noyau pour les demandes de fichiers. Il est préférable d'autoriser la valeur par défaut à Vous pouvez spécifier la taille et l’expérience du tampon. La plupart des machines liront un secteur à la fois ou un nombre entier de secteurs. La taille du secteur dépend de la façon dont vous formatez votre machine.

L'expérience suivante est intéressante. Créez un fichier contenant 1 000 000 de zéros. Utilisez la fonction de synchronisation de votre système d'exploitation pour voir à quelle vitesse il le copie dans un autre fichier (vous écrirez un programme de copie avec des E/S tamponnées et sans tampon). Le chronométrer avec différentes tailles de mémoire tampon, y compris la valeur par défaut.

10
ncmathsadist