Java IO (JavaSE 6) - Ayuda a entender los efectos de mi uso de la muestra de los arroyos y escritores

StackOverflow https://stackoverflow.com/questions/2243441

  •  19-09-2019
  •  | 
  •  

Pregunta

BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

Así que vamos a ver si lo entiendo: Una corriente de bytes de salida se abre para el archivo "out.txt". A continuación, se alimenta a una corriente de salida con buffer para hacer las operaciones de archivos más rápido. La corriente tamponada se alimenta a un escritor de flujo de salida para tender un puente de bytes a caracteres. Por último, este escritor se alimenta a un escritor tamponada ... que añade otra capa de almacenamiento temporal?

Hmm ...

¿Fue útil?

Solución

Si estás en lo correcto.

Creo que en este caso se podría hacer mucho más corto (véase también BufferedWriter )

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

o si las funciones de impresión agradable:

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

Es posible que el FileWriter crea su propia envoltura, pero esa clase sabrá qué camino es mejor.

En Java arroyos y los escritores son envolturas de modo que se puedan juntar a sus propias necesidades (por medio de apilarlos como lo hace). Las clases no se fijan en qué tipo de corriente / escritor se comparan sucesivamente. En su caso tienen varios buffers significarán que realmente tiene dos tampones, en dos clases diferentes. Esto significa que va a tomar algo de memoria adicional y posiblemente alguna pérdida de rendimiento, pero lo más probable es que nunca se dará cuenta de esto (porque es sólo una pequeña sobrecarga en comparación con otros factores de rendimiento).

Otros consejos

Este es un ejemplo de patrón decorador de la href="http://en.wikipedia.org/wiki/Decorator_pattern" rel="nofollow . La idea es agregar funcionalidad a una clase sin modificar la clase. En su ejemplo usted tiene un FileWriter. ¿Quieres lo que escriba sea necesario almacenar (buena idea si está por encima de la red) primero antes de escribir. Así superponer BufferedWriter en la parte superior de FileWriter. Otras aplicaciones pueden no desear que los datos sean amortiguadas por lo que los desarrolladores no tendrán que añadir un BufferedWriter.

No podemos anticipar lo que será necesario que todos los desarrolladores. Digamos que usted necesita para rot13 sus datos, ahora en lugar de modificar FileWriter, se crea una clase llamada Rot13Writer que implementa escritor. El Rot13Writer tomará una instancia del escritor y llevará a cabo rot13 antes de pasarlo a la siguiente escritor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top