79 votes

Java différence entre FileWriter et BufferedWriter

Quelle est la différence entre ceux-ci? Je suis en train d'apprendre Java en ce moment, mais il semble que je puisse écrire dans un fichier des deux façons, 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, est-ce que cela signifie que le premier exemple écrit les caractères un par un et que le deuxième les met d'abord en mémoire tampon et les écrit une fois?

90voto

Peter Lawrey Points 229686

BufferedWriter est plus efficace si vous

  • avez plusieurs écritures entre flush/close
  • les écritures sont petites par rapport à la taille du tampon.

Dans votre exemple, vous n'avez qu'une seule écriture, donc le BufferedWriter ajoute simplement des frais généraux dont vous n'avez pas besoin.

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

Dans les deux cas, la chaîne est écrite en une seule fois.

Si vous utilisez juste FileWriter vos appels à write(String)

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

Cela fait un appel système, par appel à write(String).


Où BufferedWriter améliore l'efficacité, c'est dans de multiples petites écritures.

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

Sans BufferedWriter, cela pourrait entraîner 200 (2 * 100) appels système et des écritures sur le disque qui sont inefficaces. Avec un BufferedWriter, tout cela peut être mis en mémoire tampon ensemble et comme la taille du tampon par défaut est de 8192 caractères, cela ne représente qu'un seul appel système pour écrire.

0 votes

J'ai une question : lorsque j'utilise FileWriter, est-ce que Java garantit que le contenu soit bien écrit sur le disque après que write ait retourné, ou est-ce que cela reste simplement en cache mémoire et le système d'exploitation s'en chargera au besoin ?

0 votes

@Jaskey si vous utilisez FileWriter non mis en mémoire tampon, write() signifie que le système d'exploitation dispose d'une copie qui doit être écrite sur le disque éventuellement.

8voto

AlexR Points 60796

Vous avez 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 voir, il vérifie en effet si le tampon est plein (if (nextChar >= nChars)) et vide le tampon. Ensuite, il ajoute un nouveau caractère au tampon (cb[nextChar++] = (char) c;).

5voto

RNJ Points 5820

BufferedWriter est plus efficace. Il économise de petites écritures et écrit dans un plus gros chunk si ma mémoire est bonne. Si vous faites beaucoup de petites écritures, j'utiliserais BufferedWriter. Appeler write appelle le système d'exploitation qui est lent, donc avoir le moins d'écritures possible est généralement souhaitable.

0voto

giorashc Points 8238

BufferedWriter met en cache vos données avant de les écrire dans le fichier physique réel, ce qui le rend plus efficace lors de l'écriture. FileWriter écrit immédiatement dans le fichier cible, rendant le processus plus lent.

0voto

Magicode Points 885

De la spécification de l'API Java:

FileWriter

Classe utilitaire pour écrire des fichiers de caractères. Les constructeurs de cette classe supposent que l'encodage de caractères par défaut et la taille par défaut du tampon de bytes sont acceptables.

BufferedWriter

Écrire du texte dans un flux de sortie de caractères, en mettant en mémoire tampon les caractères afin de permettre l'écriture efficace de caractères simples, de tableaux et de chaînes de caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X