web-dev-qa-db-fra.com

Différence Java entre FileWriter et BufferedWriter

Quelle est la différence entre ceux-ci? J'apprends juste Java ATM, mais il semble que je puisse écrire dans un fichier dans les deux sens, c'est-à-dire (je n'ai pas copié le bloc try-catch ici.)

FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();

et

FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();

Je comprends le concept de mise en mémoire tampon des données en premier. Cela signifie-t-il que le premier exemple écrit les caractères un par un et que le deuxième premier les met en mémoire tampon dans la mémoire et les écrit une fois?

63
Opi

BufferedWriter est plus efficace si vous

  • avoir plusieurs écritures entre flush/close
  • les écritures sont petites comparées à la taille de la mémoire tampon.

Dans votre exemple, vous n'avez qu'une écriture, donc BufferedWriter ajoute simplement un temps système dont vous n'avez pas besoin.

cela signifie-t-il que le premier exemple écrit les caractères un par un et que le second le met en mémoire tampon et l'écrit une fois

Dans les deux cas, la chaîne est écrite en même temps.

Si vous utilisez uniquement FileWriter, vos appels en écriture (String)

 public void write(String str, int off, int len) 
        // some code
        str.getChars(off, (off + len), cbuf, 0);
        write(cbuf, 0, len);
 }

Cela effectue un appel système, par appel à écrire (String).


BufferedWriter améliore l'efficacité de plusieurs petites écritures.

for(int i = 0; i < 100; i++) {
    writer.write("foorbar");
    writer.write(NEW_LINE);
}
writer.close();

Sans BufferedWriter, cela pourrait générer 200 (2 * 100) appels système et écrire sur le disque, ce qui est inefficace. Avec BufferedWriter, ceux-ci peuvent tous être mis ensemble en mémoire tampon. Comme la taille de mémoire tampon par défaut est de 8 192 caractères, il ne s'agit que d'un appel système à écrire.

79
Peter Lawrey

Tu as raison. Voici à quoi ressemble la méthode write() de BufferedWriter:

public void write(int c) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar >= nChars)
            flushBuffer();
        cb[nextChar++] = (char) c;
    }
}

Comme vous pouvez le constater, il vérifie si le tampon est plein (if (nextChar >= nChars)) et le vide. Ensuite, il ajoute un nouveau caractère à la mémoire tampon (cb[nextChar++] = (char) c;).

8
AlexR

BufferedWriter est plus efficace. Il enregistre de petites écritures et écrit dans un plus gros morceau si la mémoire me sert correctement. Si vous faites beaucoup de petites écritures, j'utiliserais BufferedWriter. Il est généralement souhaitable d’appeler les systèmes d’écriture vers le système d’exploitation, ce qui rend le moins possible rédacteurs.

4
RNJ

A partir de la spécification de l'API Java:

FileWriter

Classe de commodité pour écrire des fichiers de caractères. Les constructeurs de cette classe supposent que le codage de caractères par défaut et la taille de tampon d'octets par défaut sont acceptables.

BufferedWriter

Écrivez du texte dans un flux de sortie de caractères en mettant en mémoire tampon les caractères de manière à permettre l'écriture efficace de caractères, de tableaux et de chaînes isolés.

0
Magicode

http://docs.Oracle.com/javase/1.5.0/docs/api/Java/io/BufferedWriter.html

En général, un enregistreur envoie immédiatement sa sortie au flux de caractères ou d'octets sous-jacent. À moins que la sortie Invite ne soit requise, il est conseillé de placer un BufferedWriter autour de tout Writer dont les opérations write () peuvent être coûteuses, telles que FileWriters et OutputStreamWriters. Par exemple,

PrintWriter out = new PrintWriter (nouveau BufferedWriter (nouveau FileWriter ("foo.out")));

mettra en mémoire tampon la sortie de PrintWriter dans le fichier. Sans mise en mémoire tampon, chaque appel d'une méthode print () entraîne la conversion des caractères en octets, qui sont ensuite écrits immédiatement dans le fichier, ce qui peut s'avérer très inefficace.

0
Ilia Nedoluzhko