web-dev-qa-db-fra.com

FileWrite BufferedWriter et PrintWriter combinés

Ok, j'apprends donc sur les entrées/sorties et j'ai trouvé le code suivant dans l'une des diapositives. quelqu'un peut-il s'il vous plaît expliquer pourquoi il est nécessaire d'avoir un FileWrite, BufferedWriter et PrintWriter? Je sais que BufferedWriter doit mettre la sortie en mémoire tampon et la mettre en une fois, mais pourquoi utiliseraient-ils FileWriter et PrintWriter? ne font-ils pas assez la même chose avec un peu de différence dans la gestion des erreurs, etc.? 

Et aussi pourquoi passent-ils bw à PrintWriter?

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);
17
Ahoura Ghotbi

Ils utilisent vraisemblablement un FileWriter car ils veulent écrire dans un fichier. BufferedWriter et PrintWriter doivent tous deux disposer d'un autre script d'écriture - vous avez besoin de some destination éventuelle.

(Personnellement, je n'aime pas FileWriter car cela ne vous permet pas de spécifier l'encodage. Je préfère utiliser FileOutputStream entouré d'un OutputStreamWriter, mais c'est une autre affaire.)

BufferedWriter est utilisé pour la mise en mémoire tampon, comme vous le dites - bien que cela ne mette pas en mémoire tampon all la sortie, mais une quantité fixe de celle-ci (la taille de la mémoire tampon). Il crée des écritures "plus volumineuses" à l'écrivain sous-jacent.

En ce qui concerne l'utilisation de PrintWriter - eh bien, cela expose des méthodes supplémentaires telles que println. Personnellement, je n'aime pas ça car il engloutit des exceptions (vous devez vérifier explicitement avec checkError, qui ne donne toujours pas les détails et que je ne pense pas avoir - jamais vu utilisé), mais cela dépend encore une fois. sur ce que vous faites. Le PrintWriter reçoit le BufferedWriter sous la forme its destination.

Donc, le code sous la section que vous avez montrée va probablement écrire sur le PrintWriter, qui écrira sur le BufferedWriter, qui écrira (lorsque son tampon est plein, ou qu'il est vidé ou fermé), à la FileWriter données de caractère en octets sur le disque.

24
Jon Skeet

De la Docs :

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(new BufferedWriter(new FileWriter("foo.out")));

mettra en mémoire tampon la sortie de PrintWriter dans le fichier. Sans la 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. 

Vous pouvez comprendre à partir de cela qu’un BufferedWriter est un moyen efficace d’écrire des choses. 

Ecrit le 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 uniques, de tableaux et de chaînes. 

Un objet FileWriter est transmis à BufferedWriter car l’intention ici est d’écrire dans un fichier de sortie avec un BufferedWriter.

Et enfin, un PrintWriter est utilisé pour les méthodes print* comme println().

6
user2032663

FileWriter consiste simplement à écrire du texte brut (sans mise en forme); il n’utilise aucun mécanisme de tampon, quel que soit le chemin qu’il vient d’écrire. 

BufferedWriter est un wrapper pour les classes Writer afin de lui permettre d'utiliser la fonctionnalité de mémoire tampon (pour optimiser les E/S).

PrintWriter imprime le texte formaté, vous pouvez fournir une chaîne de format avec les données à imprimer, bien que cela puisse fonctionner directement avec n'importe quel Writer/OutputStream, juste pour fournir une mise en mémoire tampon, Writer/OutputStream est le premier transmis à BufferedWriter, puis le texte mis en forme est transmis à PrintWriter

2
Ankit

PrintWriter de ici

Imprime des représentations formatées d'objets dans un flux de sortie texte. Cette classe implémente toutes les méthodes d'impression trouvées dans PrintStream. Elle ne contient pas de méthodes pour écrire des octets bruts, pour lesquels un programme devrait utiliser des flux d'octets non codés.

de la déclaration ci-dessus, il semble que la principale raison d'utiliser PrintWriter est d'obtenir l'accès à toutes les méthodes de PrintStream comme println(), println(char [] x) etc.

BufferedWriter, vous avez raison C'est l'un des meilleurs moyens d'écrire dans un fichier car il met le caractère en mémoire tampon dans la mémoire virtuelle avant d'écrire directement dans un fichier et a abouti à une méthode newLine().

FileWriter de ici

FileWriter est conçu pour écrire des flux de caractères. Pour écrire des flux D’octets bruts, envisagez d’utiliser un FileOutputStream.

.

2
subodh

Habituellement, ce type de chaînage écrit concerne l’abstraction. PrintWriter possède des méthodes print et println utiles qui peuvent être pratiques si vous souhaitez imprimer des chaînes et des lignes dans un fichier. En travaillant directement avec FileWriter , vous devrez utiliser une API plus "bas niveau". Et comme vous le dites, BufferedWriter concerne la mise en mémoire tampon. Il s’agit donc essentiellement de ce que vous voulez exporter dans le fichier et du niveau d’abstraction que vous préférez.

1
NilsH

Les objets sont encapsulés dans cet ordre, car vous souhaitez utiliser le PrintWriter le plus externe pour une mise en forme plus sophistiquée. BufferedWriter doit être enveloppé dans quelque chose. FileWriter est donc ce que BufferedWriter enveloppe et constitue l’objet le plus à l’intérieur.

0