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 BufferedWriter
sources, 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.
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 –
@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
sí, es sorprendente. Iba a escribir una respuesta similar a la tuya hasta que tropecé con el comentario en salidasteamwriter. –