PrintWriter vs FileWriter en Java

¿PrintWriter y FileWriter en Java son los mismos y no importa cuál usar? Hasta ahora he usado ambos porque sus resultados son los mismos. ¿Hay algunos casos especiales en los que tiene sentido preferir uno sobre el otro?

public static void main(String[] args) { File fpw = new File("printwriter.txt"); File fwp = new File("filewriter.txt"); try { PrintWriter pw = new PrintWriter(fpw); FileWriter fw = new FileWriter(fwp); pw.write("printwriter text\r\n"); fw.write("filewriter text\r\n"); pw.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

De acuerdo con coderanch.com, si combinamos las respuestas obtenemos:

FileWriter es la representación de caracteres de IO. Eso significa que puede usarse para escribir caracteres. Internamente FileWriter usaría el conjunto de caracteres predeterminado del sistema operativo subyacente y convertiría los caracteres en bytes y los escribiría en el disco.

PrintWriter y FileWriter.

Similitudes

  1. Ambos se extienden desde Writer.
  2. Ambas son clases de representación de caracteres, lo que significa que trabajan con caracteres y los convierten en bytes utilizando el juego de caracteres predeterminado.

Diferencias

  1. FileWriter lanza IOException en caso de falla IO, esta es una excepción marcada.
  2. Ninguno de los métodos PrintWriter lanza IOException, sino que establece un indicador booleano que se puede obtener utilizando checkError ().
  3. PrintWriter tiene un constructor opcional que puede usar para habilitar el auto-enjuague cuando se llaman métodos específicos. No existe tal opción en FileWriter.
  4. Al escribir en archivos, FileWriter tiene un constructor opcional que le permite anexar al archivo existente cuando se llama al método “write ()”.

Diferencia entre PrintStream y OutputStream: similar a la explicación anterior, simplemente reemplace el carácter con byte.

PrintWriter tiene los siguientes métodos:

 close() flush() format() printf() print() println() write() 

y los constructores son:

 File (as of Java 5) String (as of Java 5) OutputStream Writer 

mientras FileWriter tiene los siguientes métodos:

 close() flush() write() 

y los constructores son:

 File String 

Enlace: http://www.coderanch.com/t/418148/java-programmer-SCJP/certification/Information-PrintWriter-FileWriter

Ambos usan un FileOutputStream internamente:

 public PrintWriter(File file) throws FileNotFoundException { this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))), false); } public FileWriter(File file) throws IOException { super(new FileOutputStream(file)); } 

pero la principal diferencia es que PrintWriter ofrece métodos especiales:

Imprime representaciones formateadas de objetos en una secuencia de salida de texto. Esta clase implementa todos los métodos de impresión encontrados en PrintStream. No contiene métodos para escribir bytes sin procesar, para los cuales un progtwig debe usar flujos de bytes no codificados.

A diferencia de la clase PrintStream, si la descarga automática está habilitada, se realizará solo cuando se invoque uno de los métodos println, printf o format, en lugar de cuando se produzca la salida de un carácter de nueva línea. Estos métodos utilizan la noción propia de separador de línea de la plataforma en lugar del carácter de nueva línea.

Un PrintWriter tiene un concepto diferente de manejo de errores. checkError() llamar a checkError() lugar de usar bloques try / catch.

PrintWriter no lanza IOException . Debe llamar checkError() método checkError() para este fin.

El java.io.PrintWriter en Java5 + permite un método / constructor conveniente que escribe en el archivo. Desde el Javadoc;

Crea un nuevo PrintWriter, sin enjuague automático de línea, con el archivo especificado. Este constructor de conveniencia crea el OutputStreamWriter intermedio necesario, que codificará caracteres utilizando el juego de caracteres predeterminado para esta instancia de la máquina virtual Java.

solo para proporcionar más información relacionada con FLUSH y Close menthod relacionado con FileOutputStream

flush () — solo se asegura de que los datos almacenados en el búfer se escriban en el disco de forma completa y estén listos para volver a escribir en la secuencia (o el escritor).

close () —- vacía los datos y cierra cualquier archivo maneja, socket o lo que sea. Ahora se ha perdido la conexión y no se puede escribir nada en outputStream.

El hecho de que java.io.FileWriter dependa de la encoding de caracteres predeterminada de la plataforma lo hace bastante inútil para mí. Nunca debe asumir algo sobre el entorno en el que se implementará su aplicación.