Esta es la tercera y ultima forma que posteare para poder crear archivos con informacion masiva
esta ocacion utilizaremos un framework llamafo "FLATWORM" el cual tiene la caracteristica de mapear en un archivo xml una o mas clases (de aqui en adelante Beans), en este archivo xml definiremos:
1.- Longitudes de campos
2.- Tipo de dato del campo
3.- Posicion del campo sobre el archivo
4.- Caracteres de relleno
5.- Formato a convertir un dato (conversion de fechas, alineacion de la informacion)
Iniciemos la construccion de archivos con flatworm
1. Crearemos un proyecto java, y le agregaremos 4 jars
commons-beanutils.jar
commons-collections.jar (para mi caso utilizare la version 3.0)
commons-logging.jar
flatworm.jar (para mi caso utiliare la version 2.0.1)
*siendo los primeros 3 de apache
2. procedamos a crear 4 paquetes
com.archivos.bean
com.archivos.configurador
com.archivos.escritura
com.archivos.main
3.- en el paquete com.archivos.bean crearemos un bean llamado Productos con las siguientes variables
enExistencia int
nombre String
codigo String
fechaInventario String
vendidas int
con sus metodos get y set
4.- sobre escribiremos el metodo toString del bean quedando lo siguiente
public String toString(){
return enExistencia + nombre + codigo + fechaInventario + vendidas;
}
5.- crearemos en el paquete com.archivos.configurador una clase llamada DatosIniciales que contendra las siguientes variables
nombreArchivo
rutaSubidaArchivo
archivoWarm
beanWarm
recordWarm
6.- en el paquete com.archivos.escritura crearemos una clase llamada EscrituraArchivo quedando de la siguiente forma
private FileCreator archivo; //clase encargada de crear y escribir sobre el archivo
private DatosIniciales datos;
// Metodo que crea el archivo, el constructor de FileCreator recibe como primer parametro
//la ruta y nombre del archivo xml y como segundo parametro el nombre y ruta del archivo
//que se creara
public void abrirArchivo(){
try {
archivo = new FileCreator(getDatos().getArchivoWarm(), getDatos().getRutaSubidaArchivo() + getDatos().getNombreArchivo());
archivo.open();
} catch (FlatwormCreatorException e) {
System.out.println("Error al crear el archivo");
} catch (UnsupportedEncodingException e) {
System.out.println("Codificacion del archivo no aceptada");
}
}
//clase que se encargara de cerrar el archivo creado
public void cerrarArchivo(){
try {
if(archivo != null){
archivo.close();
}
} catch (IOException e) {
System.out.println("Error al cerrar el archivo");
}
}
//clase encargada de escribir sobre el archivo, recibe como parametros el bean
//el metodo setBean recibe como parametros el nombre de nuestro bean, pero como esta
//mapeado en nuestro arhivo xml, como segundo parametro nuestro bean
//le agregamos un recordSeparator para que haga saltos de linea(esto es por que bloc de //notas no reconocera los saltos de linea, cualquier otro editor si)
//el metodo write se encarga de escribir y recibe como parametros el recordWarm que
//hemos mapeado en nuestro xml
public void escribir(Productos bean){
try {
archivo.setBean(getDatos().getBeanWarm(), bean);
archivo.setRecordSeperator("\r\n");
archivo.write(getDatos().getRecordWarm());
} catch (FlatwormCreatorException e) {
System.out.println("Error en el FlatWormCreator");
} catch (IOException e) {
System.out.println("Error de IO");
}
}
7.- en el paquete com.archivos.main crearemos un metodo ArmarArchivos
que quedara de la siguiente forma
EscrituraArchivo escritura;
DatosIniciales datos;
public ArmarArchivos(){
escritura = new EscrituraArchivo();
datos = new DatosIniciales();
}
//este metodo hara las veces de una consulta a una bd, solo para el ejemplo :)
public List<Productos> consultar(){
List<Productos> productos = new ArrayList<Productos>();
Productos producto1 = new Productos();
Productos producto2 = new Productos();
Productos producto3 = new Productos();
producto1.setCodigo("aaxd");
producto1.setEnExistencia(10);
producto1.setFechaInventario("09/05/2011");
producto1.setNombre("aspirina");
producto1.setVendidas(5);
producto2.setCodigo("zzsd");
producto2.setEnExistencia(20);
producto2.setFechaInventario("05/05/2011");
producto2.setNombre("melox");
producto2.setVendidas(1);
producto3.setCodigo("xxxxxxxxxx");
producto3.setEnExistencia(50);
producto3.setFechaInventario("09/04/2011");
producto3.setNombre("desodorante");
producto3.setVendidas(10);
productos.add(producto1);
productos.add(producto2);
productos.add(producto3);
return productos;
}
public static void main(String[] args) {
ArmarArchivos armar = new ArmarArchivos();
// asignacion de informacion a la clase datos
System.out.println("Asignando Datos ...");
armar.datos.setArchivoWarm("D:\\ejemplosJavaLimos\\ProductosXML.xml");
armar.datos.setBeanWarm("productosBean");//esta en el xml
armar.datos.setNombreArchivo("EjemploFlatWorm.txt");
armar.datos.setRecordWarm("productosBeanW");//esta en el xml
armar.datos.setRutaSubidaArchivo("D:\\ejemplosJavaLimos\\");
armar.escritura.setDatos(armar.datos);
List<Productos> resultados = armar.consultar();
System.out.println("Armando Archivos ...");
armar.escritura.abrirArchivo();
for(Productos producto : resultados){
armar.escritura.escribir(producto);
}
armar.escritura.cerrarArchivo();
}
8.- hemos hablado de un bendito archivo xml, pues ahora lo presento, se llamara ProductosXML.xml
< ?xml version="1.0" encoding="ISO-8859-1"? >
< file-format >
< converter name="char" class="com.blackbear.flatworm.converters.CoreConverters" method="convertChar" return-type="java.lang.String"/ >
< converter name="int" class="com.blackbear.flatworm.converters.CoreConverters" method="convertInteger" return-type="java.lang.Integer"/ >
< record name="productosBeanW" >
< record-ident >
< length-ident minlength="45" maxlength="45" / >
< /record-ident >
< record-definition >
< bean name="productosBean" class="com.archivos.bean.Productos"/ >
< line >
< record-element length="5" beanref="productosBean.enExistencia" type="int" >
< conversion-option name="justify" value="left"/ >
< conversion-option name="pad-character" value=" " / >
< /record-element >
< record-element length="20" beanref="productosBean.nombre" type="char" >
< conversion-option name="justify" value="right"/>
< conversion-option name="pad-character" value="-" / >
< /record-element >
< record-element length="5" beanref="productosBean.codigo" type="char" >
< conversion-option name="justify" value="right"/ >
< conversion-option name="pad-character" value="@" / >
< /record-element>
< record-element length="10" beanref="productosBean.fechaInventario" type="char" >
< conversion-option name="justify" value="right"/ >
< conversion-option name="pad-character" value=" " / >
< /record-element >
< record-element length="5" beanref="productosBean.vendidas" type="int" >
< conversion-option name="justify" value="right"/ >
< conversion-option name="pad-character" value=" " />
< /record-element >
< /line >
< /record-definition >
< /record >
< /file-format >
**DONDE:
*Las Etiquetas converter, definiran el tipo de variable, en este caso recibire int y String, por lo tanto declarare una del tipo in y una del tipo char(no String)
*Nuestro record se llamara productosBeanW, dentro de el podemos tener multiples beans, por eso la diferencia
*Dentro del bloque record-ident definimos la longitud maxima y minima de cada linea a escribir, esto mas que nada sirve a la hora de lectura, para diferenciar por ejemplo entre lineas de encabezado, pie de pagina, etc...
*Definimos nuestro bean, dandole nombre y la ruta dentro de nuestro proyecto
*Dentro del bloque linea, definimos nuestros elementos (variables del bean), dandole una longitud y un tipo de dato
*Entre el bloque record-element definimos las caracteristicas que tendra el campo como, el alineado, por ejemplo tenemos alineaciones a la derecha y a la izquierda, tambien podemos definir caracteres de relleno, es decir si el valor de un campo es menor a la longitud establecida, el resto se rellenara con los caracteres, tenemos 3 casos para el ejemplo, un espacion, un guion medio y un @
*Podemos definir valores por default formatear fechas entre otras opciones por medio de la etiqueta conversion-option
*Esto nos ayudara a no recompilar nuestro codigo, si las longitudes cambian, u otra cosa que no afecte al tipo de variable que se esta utilizando
*Al definir una longitud para cada campo, en caso de que sea rebasado por alguna variable, el valor de la variable sera cortado para adecuarse a la longitud
9.- Al final la salida de nuestro archivo queda:
10 ------------aspirina@aaxd09/05/2011 5
20 ---------------melox@zzsd05/05/2011 1
50 ---------desodorantexxxxx09/04/2011 10
si observas bien, el codigo del tercer producto fue cortado, la variable enExistencia se alineo a la izquierda y la variable vendidas se alineo a la derecha, la variable nombres se relleno con guines medios y la variable codigo con @
Perdon si describi poco, solo q estoy en el trabajo, pero cualquier cosa dejen sus comentarios y con gusto haremos algo al respecto
Buenos dias, interesante articulo lo estoy leyendo y me ha ayudado mucho a entender un poco mas y mejor flatworm, disculpa no podrias subir el codigo fuente.
ResponderEliminarGracias.
ok. en un rato subire las fuentes
ResponderEliminarsaludos! ! !
Ya no pondrás mas articulos relacionados a flatworm? Donde puedo descargar el codigo fuente?
ResponderEliminarGracias.
que tal, ya hay una entrada sobre la lectura de archivos con flatworm, y los fuentes aun no los he subido... este fin lo hare ya q por ahora estoy algo ocupadon en el trabajo.. pero si deceas algo en especifico sobre el framework comentalo y con gusto hare algo al respecto
ResponderEliminar