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);
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.
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()
.
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
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.
.
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.
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.