2012-09-10 21 views
57

¿Cuál es la diferencia entre esos? Estoy aprendiendo ATM Java, pero parece que puedo escribir en un archivo en ambos sentidos, es decir, (yo no copio el bloque try-catch aquí.)Diferencia de Java entre FileWriter y BufferedWriter

FileWriter file = new FileWriter("foo.txt"); 
file.write("foobar"); 
file.close(); 

y

FileWriter file = new FileWriter("foo.txt"); 
BufferedWriter bf = new BufferedWriter(file); 
bf.write("foobar"); 
bf.close(); 

Comprendo primero el concepto de almacenar los datos en la memoria intermedia, ¿significa eso que el primer ejemplo escribe los caracteres uno por uno y el segundo primero lo almacena en la memoria y lo escribe una vez?

Respuesta

73

BufferedWriter es más eficiente si

  • tiene múltiples escrituras entre ras/cierre
  • las escrituras son pequeñas en comparación con el tamaño del búfer.

En su ejemplo, solo tiene una escritura, por lo que BufferedWriter simplemente agrega una sobrecarga que no necesita.

¿Quiere decir que el primer ejemplo escribe los caracteres uno por uno y los segundos primeros tampones a la memoria y escribe una vez

En ambos casos, la cadena se escribe a la vez.

Si utiliza simplemente FileWriter su escritura (String) llama

public void write(String str, int off, int len) 
     // some code 
     str.getChars(off, (off + len), cbuf, 0); 
     write(cbuf, 0, len); 
} 

Esto hace una llamada al sistema, por llamada para escribir (String).


Donde BufferedWriter mejora la eficiencia se encuentra en varias escrituras pequeñas.

for(int i = 0; i < 100; i++) { 
    writer.write("foorbar"); 
    writer.write(NEW_LINE); 
} 
writer.close(); 

Sin BufferedWriter esto podría hacer 200 (2 * 100) llamadas al sistema y escribe en el disco, que es ineficiente. Con un BufferedWriter, todos pueden almacenarse en un búfer y, dado que el tamaño del búfer predeterminado es de 8192 caracteres, esto se convierte en solo 1 llamada al sistema para escribir.

+0

Tengo una pregunta que cuando utilizo FileWriter, después de que 'write' regrese, ¿garantiza java que el contenido está al ras en el disco O simplemente en el pagecache que os descargará cuando sea necesario? – Jaskey

+0

@Jaskey si utiliza FIleWriter sin búfer, write() significa que el sistema operativo tiene una copia que debe escribirse en el disco con el tiempo. –

4

BufferedWriter es más eficiente. Guarda pequeñas escrituras y escribe en una porción más grande si la memoria me sirve correctamente. Si haces muchas pequeñas escrituras, entonces usaría BufferedWriter. Llamar a las llamadas de escritura al sistema operativo que es lento por lo que es lo más deseable tener el menor número posible de escrituras.

8

Tienes razón. Aquí es cómo write() método de BufferedWriter se ve:

public void write(int c) throws IOException { 
    synchronized (lock) { 
     ensureOpen(); 
     if (nextChar >= nChars) 
      flushBuffer(); 
     cb[nextChar++] = (char) c; 
    } 
} 

Como se puede ver que de hecho comprueba si el buffer está lleno (if (nextChar >= nChars)) y vacía el búfer. Luego agrega un nuevo carácter al búfer (cb[nextChar++] = (char) c;).

0

De la especificación API Java:

FileWriter

clase de conveniencia para escribir archivos de caracteres. Los constructores de esta clase asumen que la codificación de caracteres predeterminada y el tamaño de byte-buffer predeterminado son aceptables.

BufferedWriter

Comentario de texto a un flujo de caracteres-producto, amortiguando personajes con el fin de prever la escritura eficiente de los caracteres individuales, matrices y cadenas.

0

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedWriter.html

En general, un escritor envía su salida inmediata al carácter o byte secuencia subyacente. A menos que se requiera una pronta salida, 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á 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.

Cuestiones relacionadas