Escribir en varios «Writer» a la vez

Publicado por pico.dev el .
java programacion blog-stack planeta-codigo
Comentarios

Java

Hace un tiempo tuve necesidad de generar cierto contenido sobre varios writers, la necesidad en concreto era generar un archivo xml en disco y al mismo tiempo el mismo contenido para un correo electrónico. Para no escribir lo mismo en dos Writer diferentes la solución fue crear un writer y este fuese el que escribiese el contenido que se le enviaba sobre varios writers. En la API de Java no hay una clase específica que haga esto pero es muy sencillo hacer una implementación que lo haga, esto va a ser lo que explicaré en el siguiente artículo.

Para hacer que el contenido de un writer se escriba a varios deberemos extender la clase Writer de esta manera su uso será como la de cualquier otro Writer. Lo especial de la implementación del writer es que su misión será realizar la misma operación que se haga sobre él sobre los writers que en este caso se pasan como parámetros en el constructor en forma de varargs.

El bucle for sobre cada uno de los Writer está encapsulado en el método doWriters, el objeto Command es que realmente hace la escritura en el writer usando el método write que se llamó sobre la clase MultipleWriter. A falta de las funciones lambda hasta Java 8 se usa el objeto Command y el método doWriters_, por contra se crea por cada método writer invocado se crea una instancia de la clase Command.

Con closures y las novedades de Java 8 en la API no sería necesario que usaramos una clase Command, el código es más sencillo, breve y más legible.

Independiente de la implementación con Java 7 o con a Java 8 el uso sería el siguiente:

Con Groovy además de las closures no será necesario que declararemos de forma explícita el lanzamiento de las excepciones sin embargo al usarlo perderíamos la ayuda que ofrece el compilador.