with - use files java
FileWrite BufferedWriter y PrintWriter combinados (6)
De los Docs :
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 recomendable envolver un BufferedWriter alrededor de cualquier escritor cuyas operaciones de escritura () puedan ser costosas, como FileWriters y OutputStreamWriters. Por ejemplo,
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
almacenará en búfer la salida de PrintWriter al archivo. Sin el almacenamiento en búfer, cada invocación de un método print () causaría que los caracteres se convirtieran en bytes que luego se escribirían inmediatamente en el archivo, lo que puede ser muy ineficiente.
De esto puedes entender que un BufferedWriter
es una forma eficiente de escribir cosas.
Escribe texto en una secuencia de salida de caracteres, y almacena en búfer los caracteres para proporcionar la escritura eficiente de caracteres individuales, matrices y cadenas.
Un objeto FileWriter
se pasa a BufferedWriter
ya que la intención aquí es escribir en un archivo de salida utilizando un BufferedWriter
.
Y finalmente, un PrintWriter
se utiliza para métodos de print*
como println()
.
Bien, estoy aprendiendo sobre E / S y encontré el siguiente código en una de las diapositivas. ¿Puede alguien explicar por qué es necesario tener un FileWrite, BufferedWriter y PrintWriter? Sé que BufferedWriter es para amortiguar la salida y ponerlo todo de una vez, pero ¿por qué usarían FileWriter y PrintWriter? ¿No hacen prácticamente lo mismo con un poco de diferencia en el manejo de errores, etc.?
¿Y también por qué pasan bw
a PrintWriter
?
FileWriter fw = new FileWriter (file);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter outFile = new PrintWriter (bw);
Los objetos se envuelven en este orden porque desea utilizar el PrintWriter más externo para su formato más sofisticado. BufferedWriter debe estar envuelto en algo. Así que FileWriter, como resultado, es lo que BufferedWriter envuelve y es el objeto más interno.
Por lo general, este tipo de encadenamiento de escritor se trata de abstracción. PrintWriter
tiene algunos métodos útiles de print
e print
que pueden ser convenientes si desea imprimir cadenas y líneas en un archivo. Trabajando directamente con FileWriter
, tendría que usar una API más de "nivel bajo". Y como dices, BufferedWriter
se trata de amortiguar. Por lo tanto, es básicamente una cuestión de lo que desea generar en el archivo y del nivel de abstracción que prefiera.
Presumiblemente están usando un FileWriter
porque quieren escribir en un archivo. Tanto a BufferedWriter
como a PrintWriter
se les debe dar otro escritor para escribir: necesita algún destino final.
(Personalmente, no me gusta FileWriter
ya que no le permite especificar la codificación. Prefiero usar FileOutputStream
en un OutputStreamWriter
, pero eso es un asunto diferente).
BufferedWriter
se utiliza para el almacenamiento en búfer, como usted dice, aunque no almacena en búfer toda la salida, solo una cantidad fija (el tamaño del búfer). Crea las escrituras "chunkier" al escritor subyacente.
En cuanto al uso de PrintWriter
, bueno, eso expone algunos métodos adicionales como println
. Personalmente, no me gusta porque se traga las excepciones (tienes que verificarlo explícitamente con checkError
, que aún no da los detalles y que creo que nunca he visto usado), pero nuevamente depende de lo que estés haciendo. . Al PrintWriter
se le pasa el BufferedWriter
como su destino.
Por lo tanto, el código debajo de la sección que ha mostrado probablemente escribirá en el PrintWriter
, que escribirá en el BufferedWriter
, el cual (cuando su buffer esté lleno, o se vacíe o cierre) escribirá en el FileWriter
, que a su vez convertirá el Datos de caracteres en bytes en el disco.
PrintWriter desde here
Imprime representaciones formateadas de objetos en un flujo 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 programa debe usar flujos de bytes no codificados.
de la declaración anterior parece ser que la razón principal para usar PrintWriter es para obtener acceso a todos los métodos de PrintStream
como println()
, println(char [] x)
etc.
BufferedWriter, tiene razón. Es una de las mejores formas de escribir en un archivo porque almacenará el carácter en la memoria virtual antes de escribir en un archivo directamente y newLine()
un método newLine()
.
FileWriter desde here
FileWriter es para escribir secuencias de caracteres. Para escribir secuencias de bytes en bruto, considere usar un FileOutputStream
.
FileWriter
es simplemente para escribir texto sin formato (sin formato), no utiliza ningún mecanismo de búfer, lo que sea que se encuentre en su forma de escritura.
BufferedWriter
es un contenedor para las clases de Writer
que le permite poder usar la funcionalidad del búfer (para optimizar la E / S).
PrintWriter
imprime texto formateado, puede proporcionar una cadena de formato junto con los datos que se imprimirán, aunque puede funcionar directamente con cualquier Writer/OutputStream
, solo para proporcionar el almacenamiento en búfer, Writer/OutputStream
se pasa primero a BufferedWriter
luego se pasa el texto formateado PrintWriter