99 votes

Différence entre java.io.PrintWriter et java.io.BufferedWriter ?

Veuillez regarder le code ci-dessous :

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

Quelle est la différence entre ces deux méthodes ?

Quand faut-il utiliser PrintWriter plutôt que BufferedWriter ?

94voto

Jon Skeet Points 692016

PrintWriter donne plus de méthodes ( println ), mais la différence la plus importante (et la plus inquiétante) dont il faut être conscient est la suivante il avale les exceptions .

Vous pouvez appeler checkError plus tard pour voir si des erreurs se sont produites, mais typiquement vous utiliserez PrintWriter pour des choses comme l'écriture dans la console - ou dans des applications "rapides et sales" où vous ne voulez pas être dérangé par des exceptions (et où la fiabilité à long terme n'est pas un problème).

Je ne suis pas sûr de la raison pour laquelle les aspects "capacités de formatage supplémentaires" et "ne pas avaler les exceptions" sont regroupés dans la même classe - le formatage est évidemment utile dans de nombreux endroits où vous Ne le fais pas. veulent que les exceptions soient avalées. Ce serait bien de voir BufferedWriter avoir les mêmes capacités à un moment donné...

0 votes

@WindyFields : Non, PrintStream est un OutputStream . PrintWriter est un Writer .

0 votes

Merci. "il avale les exceptions". Voulez-vous dire que PrintWriter ne lève pas les exceptions vérifiées ? Et les exceptions non vérifiées ?

2 votes

@Ben : Je parlais spécifiquement de IOException en ce sens que toutes les autres abstractions d'entrées-sorties ( Reader , Writer etc) déclare que ses méthodes lancent IOException si quelque chose va mal - PrintWriter ne le fait pas.

68voto

TofuBeer Points 32441

La référence API pour BufferedWriter y PrintWriter détailler les différences.

La principale raison d'utiliser le PrintWriter est d'avoir accès aux méthodes printXXX comme println(). Vous pouvez essentiellement utiliser un PrintWriter pour écrire dans un fichier, tout comme vous utiliseriez System.out pour écrire dans la console.

Un BufferedWriter est un moyen efficace d'écrire dans un fichier (ou n'importe quoi d'autre), car il mettra les caractères en mémoire tampon dans la mémoire Java avant (probablement, selon l'implémentation) de passer en C pour effectuer l'écriture dans le fichier.

Le concept de "PrintReader" n'existe pas ; le plus proche que vous obtiendrez sera probablement java.util.Scanner .

4 votes

@TritonMan à un moment donné, il doit interagir avec le système d'exploitation, ce qui signifie sortir de Java.

0 votes

Mais PrintWriter est également mis en mémoire tampon, n'est-ce pas ? donc il n'y a pas vraiment de différence entre eux comme votre réponse peut le suggérer.

0 votes

PrintWriter est mis en mémoire tampon, mais la différence réside dans les méthodes dont dispose PrintWriter. Je ne pense pas avoir sous-entendu quoi que ce soit...

8voto

Kai Huppmann Points 6119

Comme indiqué dans la réponse de TofuBeer, les deux ont leurs spécialités. Pour tirer pleinement parti de PrintWriter (ou de tout autre scripteur) tout en utilisant l'écriture en mémoire tampon, vous pouvez envelopper le BufferedWriter avec le scripteur nécessaire comme ceci :

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

2 votes

En se rappelant le commentaire de @Jons selon lequel le PrintWriter avalera les exceptions, checkError devrait être appelé.

4 votes

Au moins dans l'implémentation actuelle d'openJDK 8 (et probablement des versions plus anciennes), PrinterWriter crée déjà un BufferedWriter .

7voto

LDU Points 61

PrintWriter expose simplement les méthodes d'impression sur tout Writer en mode caractère.

BufferedWriter est plus efficace que , grâce à ses méthodes de mise en mémoire tampon. De plus, il est doté d'une méthode newLine(), en fonction de votre plate-forme système, pour manipuler correctement les fichiers texte.

Le BufferedReader permet de lire un texte depuis un fichier, avec des octets convertis en caractères. Il permet de lire ligne par ligne.

Il n'y a pas de PrintReader, vous devez choisir une autre implémentation de Reader en fonction du format de votre entrée.

3voto

Rohit Goyal Points 45

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

Remarque : le contenu du texte dans les blocs de code est automatiquement mis en forme.

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

mettra en mémoire tampon la sortie du PrintWriter vers le fichier. Sans mise en mémoire tampon, chaque invocation de la méthode print() entraînerait la conversion des caractères en octets qui seraient ensuite écrits immédiatement dans le fichier, ce qui peut être très inefficace.

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