¿Diferencia entre java.io.PrintWriter y java.io.BufferedWriter?

94

Por favor, mire el código a continuación:

// 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);

¿Cuál es la diferencia entre estos dos métodos?

¿Cuándo deberíamos usar PrintWriter sobre BufferedWriter?

i2ijeya
fuente

Respuestas:

61

La referencia de API para BufferedWriter y PrintWriter detalla las diferencias.

La razón principal para usar PrintWriter es obtener acceso a los métodos printXXX como println (). Básicamente, puede usar un PrintWriter para escribir en un archivo del mismo modo que usaría System.out para escribir en la consola.

Un BufferedWriter es una forma eficiente de escribir en un archivo (o cualquier otra cosa), ya que almacenará los caracteres en la memoria Java antes (probablemente, dependiendo de la implementación) de pasar a C para escribir en el archivo.

No existe un concepto como "PrintReader"; lo más cercano que obtendrá es probablemente java.util.Scanner .

Tofu cerveza
fuente
4
@TritonMan en algún momento necesita interactuar con el sistema operativo, lo que significa salir de Java.
TofuBeer
89

PrintWriterda más métodos ( println), pero la diferencia más importante (y preocupante) a tener en cuenta es que se traga las excepciones .

Puede llamar checkErrormás tarde para ver si se ha producido algún error, pero normalmente lo usaría PrintWriterpara cosas como escribir en la consola, o en aplicaciones "rápidas y sucias" donde no desea que le molesten las excepciones (y donde la confiabilidad a largo plazo no es un problema).

No estoy seguro de por qué los aspectos de "capacidades adicionales de formato" y "no aceptar excepciones" están agrupados en la misma clase; el formato es obviamente útil en muchos lugares donde no desea que se traguen las excepciones. Sería bueno ver BufferedWriterobtener las mismas habilidades en algún momento ...

Jon Skeet
fuente
@WindyFields: No, PrintStreames un OutputStream. PrintWriteres un Writer.
Jon Skeet
Gracias. "Se traga las excepciones". ¿Quiere decir que PrintWriter no genera excepciones marcadas? ¿Qué hay de las excepciones sin marcar?
@Ben: Yo estaba hablando específicamente sobre IOException, en el que cada otra abstracción IO ( Reader, Writeretc) declara que sus métodos emiten IOExceptionsi algo va mal - PrintWriterno.
Jon Skeet
8

Como se dice en la respuesta de TofuBeer, ambos tienen sus especialidades. Para aprovechar al máximo PrintWriter (o cualquier otro escritor) pero también usar la escritura en búfer, puede envolver el BufferedWriter con el que necesita de esta manera:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
Kai Huppmann
fuente
2
Recordando el comentario de @Jons que PrintWriter se tragará las excepciones. checkError debe llamarse.
MadMurf
1
Me encantaron los tenenbaums reales
Ogen
4
Al menos en la implementación actual de openJDK 8 (y probablemente en versiones anteriores), PrinterWriterya crea un archivo BufferedWriter.
nimrodm
7

PrintWriter simplemente expone los métodos de impresión en cualquier Writer en modo de caracteres.

BufferedWriter es más eficiente que, de acuerdo con sus métodos almacenados en búfer. Y viene con un método newLine (), dependiendo de la plataforma de su sistema, para manipular archivos de texto correctamente.

BufferedReader permite leer un texto desde un archivo, con bytes convertidos en caracteres. Permite leer línea por línea.

No hay PrintReader, debe elegir otra implementación de Reader de acuerdo con el formato de su entrada.

Lioda
fuente
3

PrintWriter es el editor más mejorado para escribir datos de caracteres en un archivo.

La principal ventaja de PrintWriter sobre FileWriter y BufferedWriter es:

  1. PrintWriter puede comunicarse directamente con el archivo y también puede comunicarse a través de algún objeto Writer.

PrintWriter printwriter = new PrintWriter("blah.txt");

(o)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Podemos escribir cualquier tipo de datos primitivos directamente en el archivo (porque tenemos versiones adicionales sobrecargadas de los métodos PrintWriter, es decir, print () y println ()).

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true

Syed Maqsood
fuente
2

En general, un escritor envía su salida inmediatamente al carácter subyacente o al flujo de bytes. A menos que se requiera una salida rápida, es aconsejable envolver un BufferedWriter alrededor de cualquier Writer cuyas operaciones write () puedan ser costosas, como FileWriters y OutputStreamWriters. Por ejemplo,

Nota: el contenido de texto en los bloques de código se ajusta automáticamente a las palabras

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

almacenará la salida del PrintWriter en el archivo. Sin almacenamiento en búfer, cada invocación de un método print () haría que los caracteres se convirtieran en bytes que luego se escribirían inmediatamente en el archivo, lo que puede ser muy ineficiente.

Rohit Goyal
fuente
0

BufferedWriter: escribe texto en un flujo de caracteres de salida y almacena en búfer los caracteres de un flujo de caracteres. PrintWriter: imprime representaciones formateadas de objetos en un flujo de salida de texto.

Vidyut Singhai
fuente
-1

Creo que la razón detrás del uso de PrintWriter ya se mencionó anteriormente, pero una de las razones importantes es que pasa un objeto de archivo directamente al constructor de PrintWriter, lo que facilita su uso.

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
AjayLohani
fuente