2011-08-08 21 views
7

Busco en la siguiente exampleEn Java, ¿cuál es la ventaja de utilizar BufferedWriter para anexar a un archivo?

que utiliza el siguiente código

try { 
     BufferedWriter out = new BufferedWriter(new FileWriter("outfilename")); 
     out.write("aString"); 
     out.close(); 
    } 
catch (IOException e) {} 

¿Cuál es la ventaja sobre haciendo

FileWriter fw = new FileWriter("outfilename"); 

He intentado tanto y que parecen comparables en velocidad cuando se viene a la tarea de anexar a un archivo una línea a la vez

Respuesta

12

El Javadoc proporciona una discusión razonable sobre este tema:

En general, un escritor envía su salida inmediata a la corriente carácter o byte subyacente. A menos que se requiera una pronta salida, es recomendable envolver un BufferedWriter alrededor de cualquier Escritor cuyas operaciones write() puedan ser costosas, como FileWriters y OutputStreamWriters. Por ejemplo,

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

se búfer de salida del PrintStream al archivo . Sin almacenamiento en búfer, cada invocación de un método de impresión() sería causar que los caracteres se conviertan en bytes que luego se escribirían inmediatamente en el archivo, lo que puede ser muy ineficiente.

Si va a escribir grandes bloques de texto a la vez (como líneas enteras), entonces probablemente no notará la diferencia. Sin embargo, si tiene un montón de código que agrega un carácter individual a la vez, un BufferedWriter será mucho más eficiente.

Editar

De acuerdo con el comentario de Andrew abajo, el FileWriter realmente utiliza su propia memoria intermedia de bytes de tamaño fijo 1024. Esto fue confirmado al mirar source code. El BufferedWritersources, por otro lado, muestra que usa un tamaño de búfer de 8192 bytes (predeterminado), que el usuario puede configurar para cualquier otro tamaño deseado. Así que parece que los beneficios de BufferedWriter vs FileWriter se limitan a:

  • mayor tamaño de búfer predeterminado.
  • Posibilidad de anular/personalizar el tamaño del búfer.

Y para enturbiar aún más las aguas, los Java 6 implementation de OutputStreamWriter en realidad delegados a una StreamEncoder, que utiliza su propio tampón con un tamaño predeterminado de 8192 bytes. Y el búfer StreamEncoder es configurable por el usuario, aunque no hay forma de acceder directamente a él a través del OutputStreamWriter adjunto.

+0

Creo que esto está mal. como dice en los javadocs, el archivista tiene un búfer - http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileWriter.html –

+0

@andrew - Buen punto, mi respuesta se basó en lo que declaraba el Javadoc 'BufferedWriter'. Sin embargo, después de ver algo del [código fuente] (http://developer.classpath.org/doc/java/io/OutputStreamWriter-source.html) parece que está en lo cierto, al menos para 'FileWriter'. Cualquier cosa derivada de 'OutputStreamWriter' usará un buffer de 1024 bytes de tamaño fijo. – aroth

+0

sí, es sorprendente. Iba a escribir una respuesta similar a la tuya hasta que tropecé con el comentario en salidasteamwriter. –

1

La efectividad de un buffer es más fácil een cuando la carga es alta. Haz un loop out. Escribe un par de miles de veces y deberías ver la diferencia.

Para unos pocos bytes pasados ​​en una sola llamada, probablemente el BufferedWriter es incluso peor (porque más tarde llama a FileOutputStream).

Cuestiones relacionadas