ad02 manejo de ficheros

Upload: yasmina-sosa

Post on 05-Mar-2016

39 views

Category:

Documents


3 download

DESCRIPTION

manejo de ficheros

TRANSCRIPT

Manejo de ficheros.Caso prctico

Anaest empezando a cursar la Formacin en Centros de Trabajo (FCT).Ya ha tenido unas reuniones conJuanyMara, 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 memoriaRAMse 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 ficherosdatos 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 denominadojava.ioque incorporainterfaces, clases y excepciones para acceder a todo tipo de ficheros.Lalibrerajava.iocontiene 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 enjava.io.

AutoevaluacinIndica 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

Anale comenta aAntonio-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 -respondeAntonio, -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 -contestaAna.Antoniointenta tranquilizar aAnay 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 claseFileque 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 laextensin.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 claseFileproporciona 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 claseFilerepresentan 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 posiblesexcepciones.Un objeto de claseFilepermite examinar el nombre del archivo, descomponerlo en su rama de directorios o crear el archivo si no existe, pasando el objeto de tipoFilea un constructor adecuado comoFileWriter(File f), que recibe como parmetro un objetoFile.Para archivos que existen, a travs del objetoFile, un programa puede examinar los atributos del archivo, cambiar su nombre, borrarlo o cambiar sus permisos. Dado un objetoFile, podemos hacer las siguientes operaciones con l: Renombrarel archivo, con elmtodorenameTo(). El objetoFiledejar de referirse al archivo renombrado, ya que elStringcon el nombre del archivo en el objetoFileno cambia. Borrarel archivo, con el mtododelete(). Tambin, condeleteOnExit()se borra cuando finaliza la ejecucin de la mquina virtual Java. Crearun nuevo fichero con un nombre nico. El mtodo estticocreateTempFile()crea un fichero temporal y devuelve un objetoFileque apunta a l. Es til para crear archivos temporales, que luego se borran, asegurndonos tener un nombre de archivo no repetido. Establecerla fecha y la hora de modificacin del archivo consetLastModified(). 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. Crearun directorio, mediante el mtodomkdir(). Tambin existemkdirs(), que crea los directorios superiores si no existen. Listarel contenido de un directorio. Los mtodoslist()ylistFiles()listan el contenido de un directorio.list()devuelve un vector deStringcon los nombres de los archivos,listFiles()devuelve un vector de objetosFile. Listarlos nombres de archivo de la raz del sistema de archivos, mediante el mtodo estticolistRoots().AutoevaluacinSeala si la afirmacin es verdadera o falsa:Podemos establecer la fecha de modificacin de un archivo mediante el mtodorenameTo().Verdadero.Falso.2.1.1.- Clase File (II).

Mediante la claseFile, podemos ver si un fichero cualquiera, digamos por ejemplotexto.txt, existe o no. Para ello, nos valemos del mtodoexists()de la claseFile. 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 usaFile. Como vers, permite listar el contenido de la carpeta que pongas en un campo de texto, introduciendo el resultado en unJList.Listar archivos.(0.01 MB)Pero, qu pasa si nos interesa copiar un fichero, cmo lo haramos?Con la claseFileno es suficiente, necesitamos saber ms, en concreto, necesitamos hablar de los flujos, como vamos a ver ms adelante.Para saber msEn este enlace puedes ver ejemplos para obtener las propiedades de los ficheros, usando la claseFile:Propiedades de los ficherosEjemplo creando carpetas o directorios en JavaAutoevaluacinSeala la opcin correcta. Con la claseFilepodemos:

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.ElinterfaceFilenameFilterse 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 parmetronombreaparezca en la lista de los ficheros del directorio indicado por el parmetrodir.En el siguiente ejemplo vemos cmo se listan los ficheros de la carpetac:\datosque tengan la extensin .txt. Usamostryycatchpara capturar las posibles excepciones, como que no exista dicha carpeta.Listar ficheros de una carpeta, filtrando.Para saber msEn el ejemplo anterior se utiliza la funcinendsWith. 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 enMS-DOS, oWindows, es decir, por ejemplo:C:\\datos\Programacion\fichero.txtCuando 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.AutoevaluacinCuando 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 queramoscrear un fichero, podemos proceder del siguiente modo:

Cdigo de crear un fichero.Paraborrar un ficheropodemos usar la claseFile, comprobando previamente si existe el fichero, del siguiente modo:

Paracrear directorios, podramos hacer:

Cdigo de crear un directorio.Paraborrar un directoriocon Java, tendremos que borrar cada uno de los ficheros y directorios que ste contenga. Al poder almacenar otros directorios, se podra recorrerrecursivamenteel 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 mtodoisDirectory().AutoevaluacinIndica si la siguiente afirmacin es verdadera o falsa:Podemos establecer un criterio para listar ficheros medianteFileNameFilter.Verdadero.Falso.3.- Flujos.Caso prctico

AnayAntoniosaben que van a tener que ayudar aJuany aMaraen labores de programacin de ficheros en Java. As que, adems, de la claseFile, van a necesitar utilizar otros conceptos relacionados con la entrada y salida: los flujos ostreams. Ana recuerda que hay dos tipos de flujos: flujos de caracteres y flujos debytes.

Un programa en Java, que necesita realizar una operacin de entrada/salida (en adelanteE/S), lo hace a travs de un flujo ostream.Unflujoes unaabstraccin de todo aquello que produce o consume informacin.La vinculacin de este flujo al dispositivo fsico la hace el sistema de entrada y salidade 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 unsocketde red; liberando al programador de tener que saber con quin est interactuando.Java define dos tipos de flujos en el paquetejava.io: Byte streams(8bits): proporciona lo necesario para la gestin de entradas y salidas debytesy su uso est orientado a la lectura y escritura de datos binarios. El tratamiento del flujo debytesviene determinado por dos clases abstractas que sonInputStreamyOutputStreamEstas dos clases definen los mtodos que sus subclases tendrn implementados y, de entre todos, destacanread()ywrite()que leen y escribenbytesde datos respectivamente. Character streams(16bits): de manera similar a los flujos de bytes, los flujos de caracteres estn determinados por dos clases abstractas, en este caso:ReaderyWriter. 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 mtodosread()ywrite()que leen y escriben caracteres de datos respectivamente.3.1.- Flujos basados en bytes.

Para el tratamiento de los flujos debytes, hemos dicho que Java tiene dos clases abstractas que sonInputStreamyOutputStream.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 llamadoUTF-8.Las clases principales que heredan deOutputStream, para la escritura de ficheros binarios son: FileOutputStream: escribebytesen 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 constructorFileOutputStream(String filePath, boolean append), poniendoappendatrue. ObjectOutputStream: convierte objetos y variables en vectores debytesque pueden ser escritos en unOutputStream. DataOutputStream, que da formato a los tipos primitivos y objetosString, convirtindolos en un flujo de forma que cualquierDataInputStream, de cualquier mquina, los pueda leer. Todos los mtodos empiezan por "write", comowriteByte(),writefloat(), etc.DeInputStream, para lectura de ficheros binarios, destacamos: FileInputStream: leebytesde un fichero. ObjectInputStream: convierte en objetos y variables los vectores debytesledos de un InputStream.En el siguiente ejemplo se puede ver cmo se escribe a un archivo binario conDataOutputStream:Escritura a fichero binario.Resumen textual alternativoCdigo de proyecto de escritura a fichero binario.(0.01 MB)En el siguiente enlace puedes ver cmo leer de un archivo binario mediante la claseFileInputStream:Leer binarioAutoevaluacinSeala si la afirmacin es verdadera o falsa:Podemos escribir datos binarios a ficheros utilizando el mtodoappendde la claseDataOutputStream.Verdadero.Falso.3.2.- Flujos basados en caracteres.

Para los flujos de caracteres, Java dispone de dos clases abstractas:ReaderyWriter.Si se usan sloFileInputStream,FileOuputStream,FileReaderoFileWriter, 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.LosBufferedReader,BufferedInputStream,BufferedWriteryBufferedOutputStreamaaden unbufferintermedio. 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, denominadoarchivo.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 conocerVdeo sobre el paquete java.io.Vdeo sobrejava.io.Resumen textual alternativoPara saber msEn este enlace puedes aprender ms sobre internacionalizacin y Unicode.InternacionalizacinAutoevaluacinMediante las clases que proporcionanbuffersse 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, yAntoniose pregunta qu opcin ser mejor para el acceso a los ficheros: siacceso 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, piensaAntonio.

Hemos visto que en Java puedes utilizardos 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 opipes. 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 msEn este enlace puedes aprender ms sobre tuberas en Java.TuberasCitas para pensarEl 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.

Comooperaciones 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 alternativoGrabar en fichero secuencial.(0.01 MB)En este ejemplo vers cmo podemoscopiarun archivo origen, a otro destino, desde la lnea de comandos.Copiar fichero.Resumen textual alternativoCopiar 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 claseFileOutputStream.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 unbufferasociado al flujo de tipoFileOutputStream.De eso se encarga la claseBufferedOutputStream, que permite que la aplicacin pueda escribir bytes en el flujo sin que necesariamente haya que llamar al sistema operativo para cadabyteescrito.Debes conocerEn este enlace puedes ver un ejemplo conbuffer.Flujos de salida con buffer.Cuando se trabaja con ficheros de texto se recomienda usar las clasesReader, para entrada o lectura de caracteres, yWriterpara 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 dosbytes.Las subclases deWriteryReaderque 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 conbytes. FileWriter, para escritura hacia un fichero de texto. Crea un flujo de salida que trabaja con caracteres en vez de conbytes.Tambin se puede montar unbuffersobre cualquiera de los flujos que definen estas clases: BufferedWriterse usa para montar unbuffersobre un flujo de salida de tipoFileWriter. BufferedReaderse usa para montar unbuffersobre un flujo de entrada de tipoFileReader.AutoevaluacinSeala si la afirmacin es verdadera o falsa: La claseReaderest 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 unBufferReader.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 cmobuscaren 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 msAunque estn en ingls, hay muchsimos ejemplos e informacin sobre la clasejava.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 claseRandomAccessFilepara 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 de desplazamiento comoseek(long posicion)oskipBytes(int 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 objetoFilecomo primer parmetro, mientras que en el segundo caso es unString. 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 alternativoClase para escribir en ficheros de acceso aleatorio.Descargar proyecto para escribir y localizar datos en ficheros de acceso aleatorio.(0.01 MB)AutoevaluacinIndica si la afirmacin es verdadera o falsa:Un objeto de la claseRandomAccessFilenecesita el modo de acceso al crear el objeto.Verdadero.Falso.5.- Trabajo con ficheros XML: analizadores sintcticos (parser) y vinculacin (binding).Caso prctico

MarayJuanestn 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 ficherosXMLpara 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 mduloLenguajes 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 informacinentre 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"oanlisis lxico-sintctico, y los programas que lo llevan a cabo se denominan "parsers" o analizadores (lxico-sintcticos). Ms especficamente podemos decir que el "parsingXML" 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 (oschema) 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 msEn el siguiente enlace de la wikipedia puedes ver el concepto de esquema y algn que otro ejemplo:Esquemas XMLAutoevaluacinDi 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 sirveJAXB(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.Parsearun 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:Bindingo vincular un esquema (schema) significa generar un conjunto de clases Java que representan el esquema.Compilador de esquemaoschema 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 runtimeframework: proporciona operaciones deunmarshallingymarshallingpara 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, elmarshallerusa 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 msHay muchos "parsers" conocidos, comoSAX(Simple APIforXML). SAX es unAPIpara parsear ficheros XML. Proporciona un mecanismo para leer datos de un documento XML. Otra alternativa esDOM(Document Object Model).Tienes ms informacin sobre DOM en la wikipedia:DOMEn este enlace se ve un ejemplo de cmo parsear un fichero XML mediante SAX.ParsearResumen textual alternativo5.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 queJAXB permite almacenar y recuperar datos en memoria en cualquier formato XML, sin la necesidad de implementar un conjunto especfico de rutinas XMLde 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.Elfuncionamiento esquemticoal 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 comandoxjc) ese fichero.xsd, de modo que nos producir losPOJOs, 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.AutoevaluacinUn 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 lossiguientes 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. Instanciandolas clases generadas.b. Invocando al mtodounmarshallde una clase generada y pasarlo en el documento. El mtodounmarshalltoma un documento XML vlido y construye una representacin de rbol de objetos.4. Acceder al rbol de contenidousando nuestra aplicacin: ahora podemos acceder al rbol de contenido y modificar sus datos.5. Generar un documento XMLdesde el rbol de contenido. Para poder hacerlo tenemos que invocar al mtodomarshallsobre 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 ficheroalbaran.xsdtiene 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 alternativoEl proyecto resultante tras seguir los pasos de la presentacin se encuentra aqu:Proyecto JAXB(0.03 MB)Para saber msEn 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 conNetBeans. Se aade un JAXBBindingutilizando el fichero XSD creado anteriormente. Se aade un servicioweby se utiliza las clases Java JAXBBindingcomo un tipo de objeto.Ejemplo con JAXB6.- Libreras para conversin de documentos XML a otros formatos.Caso prctico

Marale dice aJuanque una buena prctica paraAntonioyAnasera que hicieran los informes que necesitan para la aplicacin de la farmacia.-Tan solo tenemos que instruirles un poco enJasperReporte indicarles unos cuantos tutoriales, seguro que lo hacen bien -le comentaMaraaJuan.Maradecide, adems, consultar a su amigaBlanca, que es experta enJasperReporty 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 formatopdf, 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 msEn el siguiente enlace puedes ver un tutorial de otra herramienta de conversin de XML a otros formatos.XSLAutoevaluacinJasperReport permite generar documentos en formatohtml.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, decdigo abierto) para la rpida generacin de informes.JasperReports, es una de las ms conocidas.JasperReportses una herramienta que consta de un poderoso motor para la generacin de informes. Est empaquetada en un archivoJARy puede ser utilizada como una librera, la cul podemos integrar en cualquierIDEde 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 licenciaGPL(Licencia Pblica General).Si visitas el siguiente enlace podrs acceder a la pgina de descarga deJasperReportspara 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 JasperReportsLa descarga y el contenido de lo descargado lo podemos ver en la siguiente presentacin:Debes conocerDescarga deJasperReportse integracin enNetBeans.Resumen textual alternativoEn 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 libreraJasperReportssin 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 porJasperReports, como algunas para exportar a distintos formatos, para incluir grficos, etc. src: Ficheros fuente de la librera.Para saber msEn este enlace tienes la documentacin en lnea de la API deJasperReports.API de JasperReports6.2.- Disear y compilar la plantilla.

Las plantillas de los informes deJasperReportsson sencillamente ficheros XML con la extensin .jrxml. Podemos hacer queNetBeansreconozca 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: enNetBeanspinchamos en el menTools, y ah enOptions. Ah seleccionamosMiscellaneous, luego la pestaaFiles. Entonces pulsamos en el botnNew... para aadir la nueva extensin.Los pasos a seguir para trabajar conJasperReportseran: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 archivoDTD(Document Type Definition) definido por el motor deJasperReports.La generacin de un diseo implica editar un archivo XML validado mediante:

Estos documentos XML cuentan con una estructura similar a la de cualquier documento de texto. Fundamentalmente se siguen estas secciones: titleTtulo del informe. pageHeaderEncabezado del documento. columnHeaderEncabezado de las columnas. detailDetalle del documento. Cuerpo columnFooterPie de la columna. pageFooterPie del documento. sumaryCierre 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 mtodocompileReport().En este proceso, el diseo se transforma en un objeto serializable de tiponet.sf.jasperreports.engineJasperReport, que luego se guarda en disco.AutoevaluacinEs 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 formatoserializado) y la conexinJDBCa 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 tipoJasperPrint. 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: VisualizacinAhora 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 claseJasperViewer, la cual, a travs de su mtodomain(), recibe el informe a mostrar. Para imprimir el informe usaremos los mtodosprintReport(), printPage()oprintPages(), contenidos en la claseJasperPrintManager. Para exportar los datos a un formato de archivo especfico podemos utilizar los mtodos exportReportXXX().Vamos a construir un ejemplo comentado en la siguiente presentacin:Ejemplo conJasperReports.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 eljdk.Seguimos con conJasperReports.Resumen textual alternativoPara saber msEl principal inconveniente que puedes encontrarte al trabajar conJasperReportssin 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 comoiReport, que es tambin una herramienta de software libre.Hay mucha documentacin sobreiReporten la red, aqu te adjuntamos dos:Tutorial iReportCrear informes con iReportAnexo 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 ficheroFile fichero = new File("c:\\prufba\\miFichero.txt");// A partir del objeto File creamos el fichero fsicamenteif (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/photos/daddo83/3406962115/Autora: O'Reilly & Associates.Licencia: Copyright (cita).Procedencia: http://aps2.elekta.lt/Books/oreilly/java/fclass/figs/jfc_1101.gif

Autora: Art3mis4.Licencia: CC-by-nc-sa.Procedencia: http://www.flickr.com/photos/art3mis4/4910243349/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/photos/kasaa/2693784352/Autora: Pedro Sousa.Licencia: CC-by-nc-sa.Procedencia: http://www.flickr.com/photos/pedrosousa/2355996871/

Autora: m.Licencia: CC-by-nc.Procedencia: http://www.flickr.com/photos/asmamirza/2599581983/Autora: ConvenienceStoreGourmet.Licencia: CC-by.Procedencia: http://www.flickr.com/photos/conveniencestoregourmet/4873237650/

Autora: Ornellaswouldgo.Licencia: CC-by.Procedencia: http://www.flickr.com/photos/ornellas/4257487503/Autora: Identity chris is.Licencia: CC-by-nc-sa.Procedencia: http://www.flickr.com/photos/identity-chris-is/71240905/

Autora: aldoaldoz.Licencia: CC-by-nc-sa.Procedencia: http://www.flickr.com/photos/aldoaldoz/3895614433/#/Autora: Danard Vicente.Licencia: CC-by.Procedencia: http://www.flickr.com/photos/danardvincente/2512148775/

Autora: Fartese.Licencia: CC-by-sa.Procedencia: http://www.flickr.com/photos/fartese/4214174953/Autora: RalphTQ.Licencia: CC-by-nc.Procedencia: http://www.flickr.com/photos/ralphtq/3157588757/

Autora: Roland.Licencia: CC-by.Procedencia: http://www.flickr.com/photos/roland/4358742850/Autora: Freddy the Boy.Licencia: CC-by.Procedencia: http://www.flickr.com/photos/freddy-click-boy/3483094014/

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.Autora: Mike Baird.Licencia: CC-by.Procedencia: http://www.flickr.com/photos/mikebaird/3527406290/