Вы находитесь на странице: 1из 31

Manejo de ficheros.

Caso prctico

Ana est empezando a cursar la Formacin en Centros de Trabajo (FCT).


Ya ha tenido unas reuniones con Juan y Mara, para saber cmo se trabaja en BK programacin.
Aunque est haciendo el mdulo de FCT en esta empresa, ya sabe que a veces tendr que salir a
otras empresas acompaada de sus tutores para ver los requisitos de los sistemas que la empresa
tenga que informatizar y, en ocasiones, Antonio, quizs tambin se apunte para echar una mano.
Ana est nerviosa, tambin ilusionada, y tiene muchas ganas de conocer de cerca la realidad de lo
que ha estudiado en clase.
Ahora ver el uso de los conocimientos adquiridos de diferentes mdulos, y buscar respuestas a
posibles dudas que se vayan planteando.
En clase les haban explicado la importancia de los ficheros en el acceso a datos. -Es importante
repasar los conceptos -piensa Ana.

1.- Introduccin.

Si ests estudiando este mdulo, es probable que ya hayas estudiado el de programacin, por lo
que no te sern desconocidos muchos conceptos que se tratan en este tema.
Ya sabes que cuando apagas el ordenador, los datos de la memoria RAM se pierden. Un ordenador
utiliza ficheros para guardar los datos. Piensa que los datos de las canciones que oyes en mp3, las
pelculas que ves en formato avi, o mp4, etc., estn, al fin y al cabo, almacenadas en ficheros, los
cuales estn grabados en un soporte como son los discos duros, DVD, pendrives, etc.
Se llama a los datos que se guardan en ficheros datos persistentes, porque persisten ms all de
la ejecucin de la aplicacin que los trata. Los ordenadores almacenan los ficheros en unidades de
almacenamiento secundario como discos duros, discos pticos, etc. En esta unidad veremos, entre
otras cosas, cmo hacer con Java las operaciones de crear, actualizar y procesar ficheros.

A las operaciones, que constituyen un flujo de informacin del programa con el exterior, se les
conoce como Entrada/Salida (E/S).
Las operaciones de E/S en Java las proporciona el paquete estndar de la API de Java
denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de
ficheros.
La librera java.io contiene las clases necesarias para gestionar las operaciones de entrada y
salida con Java. Estas clases de E/S las podemos agrupar fundamentalmente en:

Clases para leer entradas desde un flujo de datos.

Clases para escribir entradas a un flujo de datos.

Clases para operar con ficheros en el sistema de ficheros local.

Clases para gestionar la serializacin de objetos.

En la imagen puedes ver las clases de las que se dispone en java.io.

Autoevaluacin
Indica si la afirmacin es verdadera o falsa:
Los datos persistentes perduran tras finalizar la ejecucin de la aplicacin que los trata.
Verdadero.
Falso.

2.- Clases asociadas a las operaciones de gestin


de ficheros y directorios.

Caso prctico

Ana le comenta a Antonio -Por lo que nos han comentado, vamos a tener que utilizar bastante los
ficheros. Cmo te manejas t con ellos?
-Pues tan bien como t -responde Antonio, -yo tambin estudi el mdulo de Programacin. Es
que no recuerdas que en el mdulo estudiamos un tema sobre ficheros?
-S, pero es que, como haba tantos mtodos para listar, renombrar archivos, etc., ya casi no me
acuerdo; y eso que hace poco que lo estudiamos -contesta Ana.
Antonio intenta tranquilizar a Ana y le dice que no se preocupe, que en cuanto se les presente la
ocasin de tener que programar con ficheros, seguro que no tienen problema y refrescan los
conceptos que aprendieron en su da.

En efecto, tal y como dicen Ana y Antonio, hay bastantes mtodos involucrados en las clases que en
Java nos permiten manipular ficheros y carpetas o directorios.
Vamos a ver la clase File que nos permite hacer unas cuantas operaciones con ficheros, tambin
veremos cmo filtrar ficheros, o sea, obtener aquellos con una caracterstica determinada, como
puede ser que tengan la extensin .odt, o la que nos interese, y por ltimo, en este apartado
tambin veremos como crear y eliminar ficheros y directorios.

2.1.- Clase File.

Para qu sirve esta clase, qu nos permite? La clase File proporciona una representacin
abstracta de ficheros y directorios.
Esta clase, permite examinar y manipular archivos y directorios, independientemente de la
plataforma en la que se est trabajando: Linux,Windows, etc.

Las instancias de la clase File representan nombres de archivo, no los archivos en s mismos.
El archivo correspondiente a un nombre puede ser que no exista, por esta razn habr que controlar
las posibles excepciones.
Un objeto de clase File permite examinar el nombre del archivo, descomponerlo en su rama de
directorios o crear el archivo si no existe, pasando el objeto de tipo File a un constructor adecuado
como FileWriter(File f), que recibe como parmetro un objeto File.
Para archivos que existen, a travs del objeto File, un programa puede examinar los atributos del
archivo, cambiar su nombre, borrarlo o cambiar sus permisos. Dado un objeto File, podemos hacer
las siguientes operaciones con l:

Renombrar el archivo, con el mtodo renameTo(). El objeto File dejar de referirse al


archivo renombrado, ya que el String con el nombre del archivo en el objeto File no
cambia.

Borrar el archivo, con el mtodo delete(). Tambin, con deleteOnExit() se borra


cuando finaliza la ejecucin de la mquina virtual Java.

Crear un
nuevo
fichero
con
un
nombre
nico.
El
mtodo
esttico createTempFile() crea un fichero temporal y devuelve un objeto File que
apunta a l. Es til para crear archivos temporales, que luego se borran, asegurndonos
tener un nombre de archivo no repetido.

Establecer la fecha y la hora de modificacin del archivo con setLastModified(). Por


ejemplo, se podra hacer: new File("prueba.txt").setLastModified(new
Date().getTime()); para establecerle la fecha actual al fichero que se le pasa como
parmetro, en este caso prueba.txt.

Crear un directorio, mediante el mtodo mkdir(). Tambin existe mkdirs(), que crea los
directorios superiores si no existen.

Listar el contenido de un directorio. Los mtodos list() y listFiles() listan el


contenido de un directorio. list() devuelve un vector de String con los nombres de los
archivos,listFiles() devuelve un vector de objetos File.

Listar los nombres de archivo de la raz del sistema de archivos, mediante el mtodo
esttico listRoots().

Autoevaluacin
Seala si la afirmacin es verdadera o falsa:
Podemos establecer la fecha de modificacin de un archivo mediante el mtodo renameTo().
Verdadero.
Falso.

2.1.1.- Clase File (II).

Mediante la clase File, podemos ver si un fichero cualquiera, digamos por ejemplo texto.txt, existe
o no. Para ello, nos valemos del mtodo exists()de la clase File. Hacemos referencia a ese
fichero en concreto con el cdigo siguiente:

File f = new File("C:\texto.txt");


En el siguiente recurso puedes descargar una pequea aplicacin en la que se usa File. Como
vers, permite listar el contenido de la carpeta que pongas en un campo de texto, introduciendo el
resultado en un JList.
Listar archivos. (0.01 MB)
Pero, qu pasa si nos interesa copiar un fichero, cmo lo haramos?
Con la clase File no es suficiente, necesitamos saber ms, en concreto, necesitamos hablar de los
flujos, como vamos a ver ms adelante.

Para saber ms
En este enlace puedes ver ejemplos para obtener las propiedades de los ficheros, usando la
clase File:
Propiedades de los ficheros
Ejemplo creando carpetas o directorios en Java

Autoevaluacin
Seala la opcin correcta. Con la clase File podemos:
Crear ficheros temporales.
Crear directorios.
Renombrar un archivo.
Todas son correctas.

2.2.- Interface FilenameFilter.

Hemos visto como obtener la lista de ficheros de una carpeta o directorio. A veces, nos interesa ver
no la lista completa, sino los archivos que encajan con un determinado criterio.
Por ejemplo, nos puede interesar un filtro para ver los ficheros modificados despus de una fecha, o
los que tienen un tamao mayor del que el que indiquemos, etc.
El interface FilenameFilter se puede usar para crear filtros que establezcan criterios de filtrado
relativos al nombre de los ficheros. Una clase que lo implemente debe definir e implementar el
mtodo:

boolean accept(File dir, String nombre)


Este mtodo devolver verdadero en el caso de que el fichero cuyo nombre se indica en el
parmetro nombre aparezca en la lista de los ficheros del directorio indicado por el parmetro dir.
En el siguiente ejemplo vemos cmo se listan los ficheros de la carpeta c:\datos que tengan la
extensin .txt. Usamos try y catch para capturar las posibles excepciones, como que no exista
dicha carpeta.
Listar ficheros de una carpeta, filtrando.

Para saber ms
En el ejemplo anterior se utiliza la funcin endsWith. Por si no sabes para que se emplea, y para
ver otras ms sobre tratamiento de cadenas, sigue este enlace:
Operaciones con cadenas.

2.3.- Rutas de los ficheros

En los ejemplos que vemos en el tema, estamos usando la ruta de los ficheros tal y como se usan
en MS-DOS, o Windows, es decir, por ejemplo:

C:\\datos\Programacion\fichero.txt

Cuando operamos con rutas de ficheros, el carcter separador entre directorios o carpetas suele
cambiar dependiendo del sistema operativo en el que se est ejecutando el programa.
Para evitar problemas en la ejecucin de los programas cuando se ejecuten en uno u otro sistema
operativo y, por tanto, persiguiendo que nuestras aplicaciones sean lo ms portables posibles, se
recomienda usar en Java: File.separator.
Podramos hacer una funcin que, al pasarle una ruta, nos devolviera la adecuada segn el
separador del sistema actual, del siguiente modo:

Cdigo de separador de rutas.

Autoevaluacin
Cuando trabajamos con fichero en Java, no es necesario capturar las excepciones, el sistema
se ocupa automticamente de ellas.
Verdadero.
Falso.

2.4.- Creacin y eliminacin de ficheros y directorios.


Cuando queramos crear un fichero, podemos proceder del siguiente modo:

Cdigo de crear un fichero.


Para borrar un fichero podemos usar la clase File, comprobando previamente si existe el fichero,
del siguiente modo:

Para crear directorios, podramos hacer:

Cdigo de crear un directorio.


Para borrar un directorio con Java, tendremos que borrar cada uno de los ficheros y directorios
que ste contenga. Al poder almacenar otros directorios, se podra recorrerrecursivamente el
directorio para ir borrando todos los ficheros.
Se puede listar el contenido del directorio e ir borrando con:

File[] ficheros = directorio.listFiles();


Si el elemento es un directorio, lo sabemos mediante el mtodo isDirectory().

Autoevaluacin
Indica si la siguiente afirmacin es verdadera o falsa:
Podemos establecer un criterio para listar ficheros mediante FileNameFilter.
Verdadero.
Falso.

3.- Flujos.

Caso prctico

Ana y Antonio saben que van a tener que ayudar a Juan y a Mara en labores de programacin de
ficheros en Java. As que, adems, de la clase File, van a necesitar utilizar otros conceptos
relacionados con la entrada y salida: los flujos o streams. Ana recuerda que hay dos tipos de flujos:
flujos de caracteres y flujos de bytes.

Un programa en Java, que necesita realizar una operacin de entrada/salida (en adelante E/S), lo
hace a travs de un flujo o stream.
Un flujo es una abstraccin de todo aquello que produce o consume informacin.
La vinculacin de este flujo al dispositivo fsico la hace el sistema de entrada y salida de Java.

Las clases y mtodos de E/S que necesitamos emplear son las mismas independientemente del
dispositivo con el que estemos actuando. Luego, el ncleo de Java sabr si tiene que tratar con el
teclado, el monitor, un sistema de archivos o un socket de red; liberando al programador de tener
que saber con quin est interactuando.
Java define dos tipos de flujos en el paquete java.io:

Byte streams (8 bits): proporciona lo necesario para la gestin de entradas y salidas


de bytes y su uso est orientado a la lectura y escritura de datos binarios. El tratamiento del
flujo
de bytes viene
determinado
por
dos
clases
abstractas
que
son InputStream y OutputStream Estas dos clases definen los mtodos que sus
subclases tendrn implementados y, de entre todos, destacan read()y write() que leen
y escriben bytes de datos respectivamente.

Character streams (16 bits): de manera similar a los flujos de bytes, los flujos de caracteres
estn determinados por dos clases abstractas, en este caso: Reader y Writer. Dichas
clases manejan flujos de caracteres Unicode. Y tambin de ellas derivan subclases
concretas que implementan los mtodos definidos en ellas siendo los ms destacados los
mtodos read() y write() que leen y escriben caracteres de datos respectivamente.

3.1.- Flujos basados en bytes.

Para el tratamiento de los flujos de bytes, hemos dicho que Java tiene dos clases abstractas que
son InputStream y OutputStream.
Los archivos binarios guardan una representacin de los datos en el archivo, es decir, cuando
guardamos texto no guardan el texto en si, sino que guardan su representacin en un cdigo
llamado UTF-8.
Las clases principales que heredan de OutputStream, para la escritura de ficheros binarios son:

FileOutputStream: escribe bytes en un fichero. Si el archivo existe, cuando vayamos a

escribir sobre l, se borrar. Por tanto, si queremos aadir los datos al final de ste, habr
que usar el constructor FileOutputStream(String
filePath, boolean
append), poniendo append a true.

ObjectOutputStream: convierte objetos y variables en vectores de bytes que pueden


ser escritos en un OutputStream.

DataOutputStream, que da formato a los tipos primitivos y objetos String,


convirtindolos en un flujo de forma que cualquier DataInputStream, de cualquier

mquina, los pueda leer. Todos los


como writeByte(), writefloat(), etc.

mtodos

empiezan

por

"write",

De InputStream, para lectura de ficheros binarios, destacamos:

FileInputStream: lee bytes de un fichero.

ObjectInputStream: convierte en objetos y variables los vectores de bytes ledos de un


InputStream.

En el siguiente ejemplo se puede ver cmo se escribe a un archivo binario con DataOutputStream:
Escritura a fichero binario.
Resumen textual alternativo

Cdigo de proyecto de escritura a fichero binario.


En el siguiente enlace
clase FileInputStream:

puedes

ver

cmo

leer

de

un

(0.01 MB)

archivo

binario

mediante

la

Leer binario

Autoevaluacin
Seala si la afirmacin es verdadera o falsa:
Podemos escribir datos binarios a ficheros
clase DataOutputStream.
Verdadero.
Falso.

utilizando

el

mtodo append de

la

3.2.- Flujos basados en caracteres.

Para los flujos de caracteres, Java dispone de dos clases abstractas: Reader y Writer.
Si se usan slo FileInputStream, FileOuputStream, FileReader o FileWriter, cada vez que
se efecta una lectura o escritura, se hace fsicamente en el disco duro. Si se leen o escriben pocos
caracteres cada vez, el proceso se hace costoso y lento por los muchos accesos a disco duro.
Los BufferedReader, BufferedInputStream, BufferedWriter y BufferedOutputStream aa
den un buffer intermedio. Cuando se lee o escribe, esta clase controla los accesos a disco. As, si
vamos escribiendo, se guardarn los datos hasta que haya bastantes datos como para hacer una
escritura eficiente.

Al leer, la clase leer ms datos de los que se hayan pedido. En las siguientes lecturas nos dar lo
que tiene almacenado, hasta que necesite leer otra vez fsicamente. Esta forma de trabajar hace los
accesos a disco ms eficientes y el programa se ejecuta ms rpido.
En el siguiente ejemplo, puedes ver cmo se lee un archivo guardado en el directorio raz,
denominado archivo.txt, cuando se pulsa el botn de la aplicacin. El contenido se introduce en el
rea de texto.
Proyecto Java para leer fichero de texto.

(0.01 MB)

Debes conocer
Vdeo sobre el paquete java.io.
Vdeo sobre java.io.
Resumen textual alternativo

Para saber ms
En este enlace puedes aprender ms sobre internacionalizacin y Unicode.
Internacionalizacin

Autoevaluacin
Mediante las clases que proporcionan buffers se pretende que se hagan lecturas y escrituras
fsicas a disco, lo antes posible y cuantas ms mejor.
Verdadero.
Falso.

4.- Formas de acceso a un fichero.

Caso prctico

El momento de programar ha llegado, y Antonio se pregunta qu opcin ser mejor para el acceso
a los ficheros: si acceso secuencial o aleatorio. Qu uso se le va a dar a estos ficheros?, para
qu van a servir cuando la aplicacin informtica est en funcionamiento? Esa es la cuestin clave,
piensa Antonio.

Hemos visto que en Java puedes utilizar dos tipos de ficheros (de texto o binarios) y dos tipos
de acceso a los ficheros (secuencial o aleatorio). Si bien, y segn la literatura que consultemos,
a veces se distingue una tercera forma de acceso denominada concatenacin, tuberas o pipes.

Acceso aleatorio: los archivos de acceso aleatorio, al igual que lo que sucede usualmente
con la memoria (RAM=Random Access Memory), permiten acceder a los datos en forma no
secuencial, desordenada. Esto implica que el archivo debe estar disponible en su totalidad
al momento de ser accedido, algo que no siempre es posible.

Acceso secuencial: En este caso los datos se leen de manera secuencial, desde el
comienzo del archivo hasta el final (el cual muchas veces no se conoce a priori). Este es el
caso de la lectura del teclado o la escritura en una consola de texto, no se sabe cundo el
operador terminar de escribir.

Concatenacin (tuberas o "pipes"): Muchas veces es til hacer conexiones entre


programas que se ejecutan simultneamente dentro de una misma mquina, de modo que
lo que uno produce se enva por un "tubo" para ser recibido por el otro, que est esperando
a la salida del tubo. Las tuberas cumplen esta funcin.

Para saber ms
En este enlace puedes aprender ms sobre tuberas en Java.
Tuberas

Citas para pensar


El futuro tiene muchos nombres. Para los dbiles es lo inalcanzable. Para los temerosos, lo
desconocido. Para los valientes es la oportunidad.
Vctor Hugo.

4.1.- Operaciones bsicas sobre ficheros de acceso


secuencial.

Como operaciones ms comunes en ficheros de acceso secuencial, tenemos el acceso para:

Crear un fichero o abrirlo para grabar datos.

Leer datos del fichero.

Borrar informacin de un fichero.

Copiar datos de un fichero a otro.

Bsqueda de informacin en un fichero.

Cerrar un fichero.

Veamos estas operaciones en unos ejemplos comentados.


En este primer ejemplo, vemos cmo se crea el fichero si no existe, o se abre para aadir datos si ya
existe:
Grabar datos en fichero secuencial.
Resumen textual alternativo

Grabar en fichero secuencial. (0.01 MB)


En este ejemplo vers cmo podemos copiar un archivo origen, a otro destino, desde la lnea de
comandos.
Copiar fichero.
Resumen textual alternativo

Copiar fichero. (0.01 MB)


En este ltimo ejemplo, has visto cmo usar la clase bsica que nos permite utilizar un fichero para
escritura de bytes: la clase FileOutputStream.
Para mejorar la eficiencia de la aplicacin reduciendo el nmero de accesos a los dispositivos de
salida en los que se almacena el fichero, se puede montar un buffer asociado al flujo de
tipo FileOutputStream. De eso se encarga la clase BufferedOutputStream, que permite que la
aplicacin pueda escribir bytes en el flujo sin que necesariamente haya que llamar al sistema
operativo para cada byte escrito.

Debes conocer

En este enlace puedes ver un ejemplo con buffer.


Flujos de salida con buffer.
Cuando se trabaja con ficheros de texto se recomienda usar las clases Reader, para entrada o
lectura de caracteres, y Writer para salida o escritura de caracteres. Estas dos clases estn
optimizadas para trabajar con caracteres y con texto en general, debido a que tienen en cuenta que
cada carcter Unicode est representado por dos bytes.
Las subclases de Writer y Reader que permiten trabajar con ficheros de texto son:

FileReader, para lectura desde un fichero de texto. Crea un flujo de entrada que trabaja
con caracteres en vez de con bytes.

FileWriter, para escritura hacia un fichero de texto. Crea un flujo de salida que trabaja
con caracteres en vez de con bytes.

Tambin se puede montar un buffer sobre cualquiera de los flujos que definen estas clases:

BufferedWriter se
tipo FileWriter.

usa

para

montar

un buffer sobre

un

flujo

de

salida

de

BufferedReader se usa para montar un buffer sobre un flujo de entrada de


tipo FileReader.

Autoevaluacin
Seala si la afirmacin es verdadera o falsa: La clase Reader est optimizada para trabajar con
ficheros binarios.
Verdadero.
Falso.

4.1.1.- Operaciones bsicas sobre ficheros de acceso secuencial


(II).

Veamos un ejemplo de lectura utilizando un BufferReader.


La clase la puedes descargar de aqu:
Clase para leer desde fichero con Buffer.

En uno de los ejemplos anteriores, has visto como podemos grabar informacin a un archivo
secuencial, concretamente nombre, apellidos y edad de las personas que vayamos introduciendo.
Ahora vamos a ver cmo buscar en un archivo secuencial, usando ese mismo ejemplo. La idea es
que al ser un fichero secuencial, tenemos que abrirlo e ir leyendo hasta encontrar el dato que
buscamos, si es que lo encontramos.

El proyecto completo lo puedes descargar de aqu:


Proyecto Java para buscar en fichero secuencial.

(0.01 MB)

Para saber ms
Aunque estn en ingls, hay muchsimos ejemplos e informacin sobre la clase java.io.
Java I/O (Input/Output)

4.2.- Operaciones bsicas sobre ficheros de acceso


aleatorio.

A menudo, no necesitas leer un fichero de principio a fin, sino simplemente acceder al fichero como
si fuera una base de datos, donde se salta de un registro a otro; cada uno en diferentes partes del
fichero. Java proporciona una clase RandomAccessFile para este tipo de entrada/salida.
Esta clase:

Permite leer y escribir sobre el fichero, no es necesario dos clases diferentes.

Necesita que le especifiquemos el modo de acceso al construir un objeto de esta clase: slo
lectura o bien lectura y escritura.

Posee

mtodos

especficos

posicion) o skipBytes(int

de
desplazamiento
como seek(long
desplazamiento) para poder movernos de un

registro a otro del fichero, o posicionarnos directamente en una posicin concreta del
fichero.
Por esas caractersticas que presenta la clase, un archivo de acceso directo tiene sus registros de
un tamao fijo o predeterminado de antemano.
La clase posee dos constructores:

RandomAccessFile(File file, String mode).

RandomAccessFile(String name, String mode).

En el primer caso se pasa un objeto File como primer parmetro, mientras que en el segundo caso
es un String. El modo es: "r" si se abre en modo lectura o "rw" si se abre en modo lectura y escritura.
A continuacin puedes ver una presentacin en la que se muestra cmo abrir y escribir en un fichero
de acceso aleatorio. Tambin, en el segundo cdigo descargable, se presenta el cdigo
correspondiente a la escritura y localizacin de registros en ficheros de acceso aleatorio.
Escribir en ficheros de acceso aleatorio.
Resumen textual alternativo

Clase para escribir en ficheros de acceso aleatorio.


Descargar proyecto para escribir y localizar datos en ficheros de acceso aleatorio.

(0.01 MB)

Autoevaluacin
Indica si la afirmacin es verdadera o falsa:
Un objeto de la clase RandomAccessFile necesita el modo de acceso al crear el objeto.
Verdadero.
Falso.

5.- Trabajo con ficheros XML: analizadores


sintcticos (parser) y vinculacin (binding).

Caso prctico

Mara y Juan estn trabajando en un proyecto comn, una aplicacin para "Farmacia Manoln de
Benidorm". Hay una parte de la aplicacin que no hicieron ellos, sino el hermano del farmacutico,
que tiene ciertos conocimientos, por su inters autodidacta de la informtica. Parece ser que Arturn,
el hermano de Manoln, utiliz ficheros XML para guardar informacin de la aplicacin. Juan y Mara
estn contemplando la posibilidad de aprovechar lo que hay desarrollado, estudiando la aplicacin y
viendo si podran analizar los ficheros XML que ya existen para obtener la informacin que desean.

Probablemente hayas estudiado ya XML, bien porque hayas cursado el mdulo Lenguajes de
marcas y sistemas de gestin de informacin, o bien porque lo conozcas por tu cuenta. Si no
conoces XML, te recomendamos que te familiarices con l, hay mltiples tutoriales y cursos en
Internet.
El metalenguaje XML se crea para evitar problemas de interoperabilidad entre plataformas y redes.
Con l se consigue un soporte estndar para el intercambio de datos: no slo los datos estn en un
formato estndar sino tambin la forma de acceder a ellos. Y entre las ventajas de su uso
destacamos:

Facilita el intercambio de informacin entre distintas aplicaciones ya que se basa en


estndares aceptados.

Proporciona una visin estructurada de la informacin, lo que permite su posterior


tratamiento de forma local.

5.1.- Conceptos previos.

Cmo se trabaja con datos XML desde el punto de vista del desarrollador de aplicaciones?
Una aplicacin que consume informacin XML debe:

Leer un fichero de texto codificado segn dicho estndar.

Cargar la informacin en memoria y, desde all...

Procesar esos datos para obtener unos resultados (que posiblemente tambin almacenar
de forma persistente en otro fichero XML).

El proceso anterior se enmarca dentro de lo que se conoce en informtica


como "parsing" o anlisis lxico-sintctico, y los programas que lo llevan a cabo se denominan
"parsers" o analizadores (lxico-sintcticos). Ms especficamente podemos decir que el
"parsing XML" es el proceso mediante el cual se lee y se analiza un documento XML para
comprobar que est bien formado para, posteriormente, pasar el contenido de ese documento a una
aplicacin cliente que necesite consumir dicha informacin.
Schema: Un esquema (o schema) es una especificacin XML que dicta los componentes permitidos
de un documento XML y las relaciones entre los componentes. Por ejemplo, un esquema identifica
los elementos que pueden aparecer en un documento XML, en qu orden deben aparecer, qu
atributos pueden tener, y qu elementos son subordinados (esto es, son elementos hijos) para otros
elementos. Un documento XML no tiene por qu tener un esquema, pero si lo tiene, debe atenerse a
ese esquema para ser un documento XML vlido.

Para saber ms
En el siguiente enlace de la wikipedia puedes ver el concepto de esquema y algn que otro ejemplo:
Esquemas XML

Autoevaluacin
Di si la afirmacin es verdadera o falsa:
XML hace ms fcil el intercambio de informacin entre sistemas.
Verdadero.
Falso.

5.2.- Definiciones.

Qu es y para qu sirve JAXB (Java Architecture for XML Binding)? JAXB simplifica el acceso a
documentos XML representando la informacin obtenida de los documentos XML en un programa
en formato Java, o sea, proporciona a los desarrolladores de aplicaciones Java, una forma rpida
para vincular esquemas XML a representaciones Java.
JAXB proporciona mtodos para, a partir de documentos XML, obtener rboles de contenido
(generados en cdigo Java), para despus operar con ellos o manipular los los mismos en una
aplicacin Java y generar documentos XML con la estructura de los iniciales, pero ya modificados.

Parsear un documento XML consiste en "escanear" el documento y dividirlo o separarlo lgicamente


en piezas discretas. El contenido parseado est entonces disponible para la aplicacin.
Binding: Binding o vincular un esquema (schema) significa generar un conjunto de clases Java que
representan el esquema.
Compilador de esquema o schema compiler: liga un esquema fuente a un conjunto de elementos
de programa derivados. La vinculacin se describe mediante un lenguaje de vinculacin basado en
XML.
>Binding runtime framework: proporciona operaciones de unmarshalling y marshalling para
acceder, manipular y validar contenido XML usando un esquema derivado o elementos de programa.
Marshalling: es un proceso de codificacin de un objeto en un medio de almacenamiento,
normalmente un fichero. Proporciona a una aplicacin cliente la capacidad para convertir un rbol de
objetos Java JAXB a ficheros XML. Por defecto, el marshaller usa codificacin UTF-8 cuando genera
los datos XML.
Unmarshalling: proporciona a una aplicacin cliente la capacidad de convertir datos XML a objetos
Java JAXB derivados.

Para saber ms
Hay muchos "parsers" conocidos, como SAX (Simple API for XML). SAX es un API para parsear
ficheros XML. Proporciona un mecanismo para leer datos de un documento XML. Otra alternativa
es DOM (Document Object Model).
Tienes ms informacin sobre DOM en la wikipedia:
DOM
En este enlace se ve un ejemplo de cmo parsear un fichero XML mediante SAX.
Parsear
Resumen textual alternativo

5.3.- Introduccin a JAXB.

JAXB permite mapear clases Java a representaciones en XML y viceversa.


JAXB proporciona dos principales caractersticas:

La capacidad de serializar (marshalling) objetos Java a XML.

Lo inverso, es decir, deserializar (unmarshalling) XML a objetos Java.

O sea que JAXB permite almacenar y recuperar datos en memoria en cualquier formato XML,
sin la necesidad de implementar un conjunto especfico de rutinas XML de carga y salvaguarda
para la estructura de clases del programa.
El compilador de JAXB (schema compiler) permite generar una serie de clases Java que podrn ser
llamadas desde nuestras aplicaciones a travs de mtodos sets y gets para obtener o establecer los
datos de un documento XML.
El funcionamiento esquemtico al usar JAXB sera:

Crear un esquema (fichero .xsd) que contendr las estructura de las clases que deseamos
utilizar.

Compilar con el JAXB compiler (bien con un IDE como NetBeans o desde lnea de
comandos con el comando xjc) ese fichero .xsd, de modo que nos producir los POJOs, o
sea, una clase por cada uno de los tipos que hayamos especificado en el fichero .xsd.
Esto nos producir los ficheros .java.

Compilar esas clases java.

Crear un documento XML: validado por su correspondiente esquema XML, o sea el


fichero .xsd, se crea un rbol de objetos.

Ahora se puede parsear el documento XML, accediendo a los mtodos gets y sets del rbol
de objetos generados por el proceso anterior. As se podr modificar o aadir datos.

Despus de realizar los cambios que se estimen, se realiza un proceso para sobrescribir el
documento XML o crear un nuevo documento XML.

Autoevaluacin
Un schema permite validar un documento XML.
Verdadero.
Falso.

5.4.- Funcionamiento de JAXB.

Para construir una aplicacin JAXB necesitamos tener un esquema XML.


Tras obtener el esquema XML, seguimos los siguientes pasos para construir la aplicacin JAXB:

1.

Escribir el esquema: es un documento XML que contiene la estructura que se tomar


como indicaciones para construir las clases. Estas indicaciones pueden ser, por ejemplo, el
tipo primitivo al que se debe unir un valor de atributo en la clase generada.

2.

Generar los ficheros fuente de Java: para esto usamos el compilador de esquema, ya que
ste toma el esquema como entrada de informacin. Cuando se haya compilado el cdigo
fuente, podremos escribir una aplicacin basada en las clases que resulten.

3.

Construir el rbol de objetos Java: con nuestra aplicacin, se genera el rbol de objetos
java, tambin llamado rbol de contenido, que representa los datos XML que son validados
con el esquema. Hay dos formas de hacer esto:
a.

Instanciando las clases generadas.

b.

Invocando al mtodo unmarshall de una clase generada y pasarlo en el


documento. El mtodo unmarshall toma un documento XML vlido y construye
una representacin de rbol de objetos.

4.

Acceder al rbol de contenido usando nuestra aplicacin: ahora podemos acceder al


rbol de contenido y modificar sus datos.

5.

Generar un documento XML desde el rbol de contenido. Para poder hacerlo tenemos
que invocar al mtodo marshall sobre el objeto raz del rbol.

Aunque estos pasos que acabamos de comentarte te parezcan algo complicados, vamos a ver un
ejemplo sencillo, en el que clarificaremos todo esto, comprobando que no es tan difcil como parece.
Vamos a suponer una estructura de un archivo que podra usarse en un almacn distribuidor de
medicamentos. El fichero albaran.xsd tiene la estructura que el almacn usa cuando enva un
pedido de medicamentos que le ha hecho una farmacia.
Puedes descargarlo para examinarlo aqu:
Fichero albaran.xsd (1 KB)
Vamos a ver el desarrollo del proyecto en la siguiente presentacin:
Ejemplo de proyecto sencillo con JAXB.
Resumen textual alternativo

El proyecto resultante tras seguir los pasos de la presentacin se encuentra aqu:


Proyecto JAXB (0.03 MB)

Para saber ms
En el siguiente enlace puedes ver un ejemplo paso a paso en el que:

Se crea el fichero de esquema XML.

Se crea un proyecto nuevo con NetBeans.

Se aade un JAXB Binding utilizando el fichero XSD creado anteriormente.

Se aade un servicio web y se utiliza las clases Java JAXB Binding como un tipo de
objeto.
Ejemplo con JAXB

6.- Libreras para conversin de documentos XML a


otros formatos.

Caso prctico

Mara le dice a Juan que una buena prctica para Antonio y Ana sera que hicieran los informes
que necesitan para la aplicacin de la farmacia.
-Tan solo tenemos que instruirles un poco en JasperReport e indicarles unos cuantos tutoriales,
seguro que lo hacen bien -le comentaMara a Juan.
Mara decide, adems, consultar a su amiga Blanca, que es experta en JasperReport y trabaja en
otra empresa, qu tutoriales de Internet o de cualquier otra fuente recomendara a unos principiantes
en esta materia.

En la mayora de aplicaciones informticas, hay que mostrar la informacin resultante de los


procesos que se ejecutan, sobre todo en aplicaciones que generan informacin que implica tomar
decisiones comerciales. Dicha informacin est almacenada normalmente en bases de datos o en
archivos.
Hoy en da, XML est muy extendido, y muchas empresas guardan la informacin en ficheros o
bases de datos con ese formato.
Hay muchos productos o herramientas informticas que permiten convertir documentos XML a otros
formatos.
En nuestro caso, vamos a optar por una herramienta que permite generar informes de todo tipo en
Java de una forma sencilla: JasperReport.

Esta herramienta permite generar informes electrnicos en formato pdf, quizs el formato ms usado
debido a su portabilidad entre sistemas conservando la apariencia. Pero existen muchos ms: xls,
html, rtf, csv, xml, etc.

Para saber ms
En el siguiente enlace puedes ver un tutorial de otra herramienta de conversin de XML a otros
formatos.
XSL

Autoevaluacin
JasperReport permite generar documentos en formato html.
Verdadero.
Falso.

6.1.- Introduccin a JasperReport.

En Java, durante un tiempo, la generacin de informes fue uno de los puntos dbiles del lenguaje,
pero hoy en da, existen muchas libreras y herramientas dedicadas (varias de ellas, de cdigo
abierto) para la rpida generacin de informes. JasperReports, es una de las ms conocidas.
JasperReports es una herramienta que consta de un poderoso motor para la generacin de
informes. Est empaquetada en un archivo JAR y puede ser utilizada como una librera, la cul
podemos integrar en cualquier IDE de desarrollo en Java para desarrollar nuestras aplicaciones.
Est escrita totalmente en Java, su cdigo es abierto y es totalmente gratuita bajo los trminos de la
licencia GPL (Licencia Pblica General).
Si visitas el siguiente enlace podrs acceder a la pgina de descarga de JasperReports para todas
las plataformas. Encontrars una lista con todas las versiones disponibles, no es necesario
identificarte para poder bajarte la que desees.
Zona de descarga de JasperReports
La descarga y el contenido de lo descargado lo podemos ver en la siguiente presentacin:

Debes conocer
Descarga de JasperReports e integracin en NetBeans.
Resumen textual alternativo

En la presentacin que acabas de ver, al descomprimir el fichero de la descarga, has visto que en el
mismo hay varios directorios o carpetas. Comentamos brevemente qu contiene cada una:

build: es la librera JasperReports sin empaquetar, con todas las clases que incluye.

demo: podemos encontrar algunos ejemplos de utilizacin de la librera. Estos ejemplos


estn preparados para ser compilados con la herramienta "ant". Puedes inspeccionar el
cdigo Java e intentar compilarlos y ejecutarlos.

dist: es donde se encuentra realmente la librera empaquetada en un fichero JAR


(jasperreports-3.7.4.jar) y algunos ficheros JAR que no utilizaremos. Tambin
podemos acceder a la documentacin tipo javadoc.

docs: es la referencia rpida en formato XML.

lib: Diferentes libreras necesarias por JasperReports, como algunas para exportar a
distintos formatos, para incluir grficos, etc.

src: Ficheros fuente de la librera.

Para saber ms
En este enlace tienes la documentacin en lnea de la API de JasperReports.
API de JasperReports

6.2.- Disear y compilar la plantilla.

Las plantillas de los informes de JasperReports son sencillamente ficheros XML con la extensin
.jrxml. Podemos hacer que NetBeansreconozca este tipo de ficheros como XML, para que cuando
los editemos en el editor se muestren los mismos cdigos de colores en las etiquetas y dems
elementos de la sintaxis de XML.
En la imagen se ilustra cmo conseguirlo: en NetBeans pinchamos en el men Tools, y ah
en Options. Ah seleccionamos Miscellaneous, luego la pestaa Files. Entonces pulsamos en el
botn New... para aadir la nueva extensin.
Los pasos a seguir para trabajar con JasperReport seran:
Paso 1: Disear la plantilla del informe: un fichero .jrxml. El documento de diseo est
representado por un archivo XML que mantiene la estructura de un archivo DTD(Document Type
Definition) definido por el motor de JasperReports.
La generacin de un diseo implica editar un archivo XML validado mediante:

<!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report


Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
Estos documentos XML cuentan con una estructura similar a la de cualquier documento de texto.
Fundamentalmente se siguen estas secciones:

title Ttulo del informe.

pageHeader Encabezado del documento.

columnHeader Encabezado de las columnas.

detail Detalle del documento. Cuerpo

columnFooter Pie de la columna.

pageFooter Pie del documento.

sumary Cierre del documento.

Paso 2: Compilacin: Una vez que se ha realizado el diseo, se compila antes de poder iniciar el
proceso de carga de datos. La compilacin se lleva a cabo a travs del mtodo compileReport().
En
este
proceso,
el
diseo
se
transforma
en
un
objeto
serializable
tipo net.sf.jasperreports.engine JasperReport, que luego se guarda en disco.

de

Autoevaluacin
Es correcta la afirmacin siguiente?
Los documentos XML que se usan en el diseo de los informes cuentan con una serie de secciones.
Verdadero.
Falso.

6.3.- Rellenar el informe con datos, exportar el informe.

Paso 3: Rellenar el informe con datos: mediante los mtodos fillReportXXX(), se puede realizar la
carga de datos del informe, pasndole como parmetros el objeto de diseo (o bien, el archivo que

lo representa en formato serializado) y la conexin JDBC a la base de datos desde donde se


obtendr la informacin que necesitemos.
Como resultado de este proceso, se obtiene un objeto que representa un documento listo para ser
impreso, un objeto serializable de tipo JasperPrint. Este objeto puede guardarse en disco para su
uso posterior, o bien puede ser impreso, enviado a la pantalla o transformado en PDF, XLS, CSV,
etc.
Paso 4: Visualizacin
Ahora podemos optar por mostrar un informe por pantalla, imprimirlo, o bien obtenerlo en algn tipo
especfico de fichero, como PDF, etc.

Para mostrar un informe por pantalla se utiliza la clase JasperViewer, la cual, a travs de
su mtodo main(), recibe el informe a mostrar.

Para

Para exportar los datos a un formato de archivo especfico podemos utilizar los mtodos
exportReportXXX().

imprimir
el
informe
usaremos
los
mtodos printReport(),
printPage() o printPages(), contenidos en la clase JasperPrintManager.

Vamos a construir un ejemplo comentado en la siguiente presentacin:


Ejemplo con JasperReports.
Resumen textual alternativo

Seguimos desarrollando el ejemplo. Ahora vamos a hacer que obtenga datos de una base de datos.
En concreto, de la base de datos derby que se incluye al instalar el jdk.
Seguimos con con JasperReports.
Resumen textual alternativo

Para saber ms
El principal inconveniente que puedes encontrarte al trabajar con JasperReports sin ms, es sin
duda el diseo del informe. Por ello, para facilitar el diseo de los mismos, y hacerlos de manera
visual y cmoda se pueden usar otros productos como iReport, que es tambin una herramienta de
software libre.
Hay mucha documentacin sobre iReport en la red, aqu te adjuntamos dos:
Tutorial iReport
Crear informes con iReport

Anexo I.- Listar ficheros de una carpeta, filtrando.


import java.io.File;

import java.io.FilenameFilter;
public class Filtrar implements FilenameFilter {
String extension;
// Constructor
Filtrar(String extension){
this.extension = extension;
}
public boolean accept(File dir, String name){
return name.endsWith(extension);
}
public static void main(String[] args) {
try {
// Obtendremos el listado de los archivos de ese directorio
File fichero=new File("c:\\datos\\.");
String[] listadeArchivos = fichero.list();
// Filtraremos por los de extension .txt
listadeArchivos = fichero.list(new Filtrar(".txt"));
// Comprobamos el nmero de archivos en el listado
int numarchivos = listadeArchivos.length ;
// Si no hay ninguno lo avisamos por consola
if (numarchivos < 1)
System.out.println("No hay archivos que listar");
// Y si hay, escribimos su nombre por consola.
else
{
for(int conta = 0; conta < listadeArchivos.length;
conta++)
System.out.println(listadeArchivos[conta]);
}
}
catch (Exception ex) {
System.out.println("Error al buscar en la ruta indicada");
}
}
}

Anexo II.- Cdigo de separador de rutas.


String substFileSeparator(String ruta){
String separador = "\\";
try{
// Si estamos en Windows
if ( File.separator.equals(separador) )
separador = "/" ;
// Reemplaza todas las cadenas que coinciden con la expresin
// regular dada oldSep por la cadena File.separator

return ruta.replaceAll(separador, File.separator);


}catch(Exception e){
// Por si ocurre una java.util.regex.PatternSyntaxException
return ruta.replaceAll(separador + separador,
File.separator);
}
}

Anexo III.- Cdigo de crear un fichero.


try {
// Creamos el objeto que encapsula el fichero
File fichero = new File("c:\\prufba\\miFichero.txt");
// A partir del objeto File creamos el fichero fsicamente
if (fichero.createNewFile())
System.out.println("El fichero se ha creado
correctamente");
else
System.out.println("No ha podido ser creado el
fichero");
} catch (Exception ioe) {
ioe.getMessage();
}

Anexo IV.- Cdigo de crear un directorio.


try {
// Declaracin de variables
String directorio = "C:\\prueba";
String varios = "carpeta1/carpeta2/carpeta3";
// Crear un directorio
boolean exito = (new File(directorio)).mkdir();
if (exito)
System.out.println("Directorio: " + directorio + " creado");
// Crear varios directorios
exito = (new File(varios)).mkdirs();
if (exito)
System.out.println("Directorios: " + varios + " creados");
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}

Anexo.- Licencias de recursos.

Licencias de recursos utilizados en la Unidad de Trabajo.

Recurso
(1)

Datos del recurso (1)

Recurso
(2)

Datos del recurso (2)

Autora: daddo83.
Licencia: CC-by-nc.
Procedencia:
http://www.flickr.com/ph
otos/daddo83/34069621
15/

Autora: O'Reilly & Associates.


Licencia: Copyright (cita).
Procedencia:
http://aps2.elekta.lt/Books/oreil
ly/java/fclass/figs/jfc_1101.gif

Autora: Art3mis4.
Licencia: CC-by-nc-sa.
Procedencia:
http://www.flickr.com/ph
otos/art3mis4/49102433
49/

Autora: Jos Javier Bermdez


Hernndez.
Licencia: Copyright (Cita).
Procedencia: Captura de
pantalla del programa
Explorer, propiedad de
Microsoft.

Autora: Kasaa.
Licencia: CC-by-nc.
Procedencia:
http://www.flickr.com/ph
otos/kasaa/2693784352
/

Autora: Pedro Sousa.


Licencia: CC-by-nc-sa.
Procedencia:
http://www.flickr.com/photos/pe
drosousa/2355996871/

Autora: m.
Licencia: CC-by-nc.
Procedencia:
http://www.flickr.com/ph
otos/asmamirza/259958
1983/

Autora:
ConvenienceStoreGourmet.
Licencia: CC-by.
Procedencia:
http://www.flickr.com/photos/co
nveniencestoregourmet/48732
37650/

Licencias de recursos utilizados en la Unidad de Trabajo.

Recurso
(1)

Datos del recurso (1)

Recurso
(2)

Datos del recurso (2)

Autora:
Ornellaswouldgo.
Licencia: CC-by.
Procedencia:
http://www.flickr.com/ph
otos/ornellas/42574875
03/

Autora: Identity chris is.


Licencia: CC-by-nc-sa.
Procedencia:
http://www.flickr.com/photos/id
entity-chris-is/71240905/

Autora: aldoaldoz.
Licencia: CC-by-nc-sa.
Procedencia:
http://www.flickr.com/ph
otos/aldoaldoz/3895614
433/#/

Autora: Danard Vicente.


Licencia: CC-by.
Procedencia:
http://www.flickr.com/photos/da
nardvincente/2512148775/

Autora: Fartese.
Licencia: CC-by-sa.
Procedencia:
http://www.flickr.com/ph
otos/fartese/421417495
3/

Autora: RalphTQ.
Licencia: CC-by-nc.
Procedencia:
http://www.flickr.com/photos/ral
phtq/3157588757/

Autora: Roland.
Licencia: CC-by.
Procedencia:
http://www.flickr.com/ph
otos/roland/4358742850
/

Autora: Freddy the Boy.


Licencia: CC-by.
Procedencia:
http://www.flickr.com/photos/fre
ddy-click-boy/3483094014/

Licencias de recursos utilizados en la Unidad de Trabajo.

Recurso
(1)

Datos del recurso (1)

Autora: Jos Javier


Bermdez Hernndez.
Licencia: GNU GPL v2.
Procedencia: Montaje
sobre Captura de
pantalla del programa
NetBeans, propiedad
Sun Microsystems, bajo
licencia GNU GPL v2.

Recurso
(2)

Datos del recurso (2)

Autora: Mike Baird.


Licencia: CC-by.
Procedencia:
http://www.flickr.com/photos/mi
kebaird/3527406290/

Вам также может понравиться