Acceso a datos

1,770 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,770
On SlideShare
0
From Embeds
0
Number of Embeds
1,106
Actions
Shares
0
Downloads
40
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Acceso a datos

  1. 1. ACCESO A DATOS
  2. 2. INTRODUCCIÓN El módulo Acceso a Datos se desarrollará a lo largo de este curso con una duración de 6 horas semanales. El alumno aprenderá a desarrollar aplicaciones que gestionen la información almacenada en ficheros, bases de datos y XML, y la utilización de herramientas de mapeo objeto relacional (ORM).
  3. 3. CONTENIDOS El módulo Acceso a Datos está distribuido en 6 unidades de trabajo, distribuidas en dos evaluaciones, que se detallan a continuación: Primera evaluación: 1. Programación avanzada PL/SQL. Bases de datos relacionales y orientadas a objetos. 2. Bases de datos XML Segunda evaluación: 3. Manejo de ficheros 4. Herramientas de mapeo objeto relacional 5. Manejo de conectores 6. Programación de componentes de acceso a datos
  4. 4. RECURSOS Para el desarrollo y aprendizaje del módulo Acceso a datos vamos a necesitar un compilador de Java para el desarrollo de los ejercicios prácticos propuestos. El entorno de desarrollo que vamos a utilizar es Eclipse, por ser un entorno de desarrollo libre muy potente.
  5. 5. UT 3. MANEJO DE FICHEROS Contenidos de la unidad 1. Introducción 2. Formas de acceso a un fichero. Clases asociadas 3. Flujos o Streams. Tipos. 4. Formas de acceso a un fichero 5. Operaciones sobre ficheros 6. Clases para gestión de flujos de datos desde/hacia ficheros 7. Trabajo con ficheros XML (Extended Markup Language)
  6. 6. UT 3. MANEJO DE FICHEROS 1. Introducción En esta unidad se muestran algunas alternativas diferentes para trabajar con ficheros. Aunque no son todas las posibles, estas soluciones pueden considerarse una referencia dentro de las soluciones actuales respecto al almacenamiento de datos en ficheros. Aunque las diferentes alternativas de acceso a ficheros mostradas en el capítulo se han trabajado desde la perspectiva de Java, la mayoría de entornos de programación dan soporte a estas mismas alternativas, aunque con otra sintaxis (por ejemplo, Microsoft .NET). Las primeras secciones del capítulo se centran en el acceso a ficheros desde Java (flujos). Para comprender adecuadamente estos contenidos, es recomendable que el lector esté familiarizado con conceptos básicos de programación en Java. Las últimas secciones se centran en el manejo de XML como tipo especial de fichero.
  7. 7. UT 3. MANEJO DE FICHEROS 1. Introducción Un fichero o archivo es un conjunto de bits almacenado en un dispositivo, como por ejemplo un disco duro. Una de las ventajas de usar ficheros es que éstos no son volátiles. Los ficheros tienen un nombre y se ubican en directorios o carpetas, el nombre debe ser único en ese directorio. Por convención cuentan con diferentes extensiones que por lo general suelen ser tres letras (PDF, DOC, GIF, …) y nos permiten saber el tipo de archivo.
  8. 8. UT 3. MANEJO DE FICHEROS 2. Formas de acceso a un fichero. Clases asociadas. Antes de ver las clases que leen y escriben datos en ficheros, vamos a manejar la clase File:  File es una clase dentro del paquete java.io  Representa un archivo o directorio dentro de un sistema de ficheros.  Un objeto de la clase File representa el nombre de un fichero o directorio.  Los métodos de File permiten obtener toda la información sobre las características del fichero o directorio.
  9. 9. UT 3. MANEJO DE FICHEROS 2. Formas de acceso a un fichero. Clases asociadas. Para crear un objeto File, se puede utilizar cualquiera de los tres constructores siguientes:  File(String directorioyfichero) new File(“C:directoriofichero.txt”);  File(String directorio, String nombrefichero) new File(“directorio”, “fichero.txt”);  File(File directorio, String fichero) new File(new File(“directorio”), “fichero.txt”);
  10. 10. UT 3. MANEJO DE FICHEROS 2. Formas de acceso a un fichero. Clases asociadas. El siguiente ejemplo muestra la lista de ficheros del directorio actual utilizando el método list() que devuelve un array de Strings con los nombres de los ficheros y directorios contenidos en el directorio asociado al objeto File: import java.io.*; public class VerDir { public static void main (String[] args) { System.out.println(“Ficheros en el directorio actual: “); File f = new File(“.”); String[] archivos = f.list(); for (int i = 0; i < archivos.length; i++) { System.out.println(archivos[i]); } } }
  11. 11. UT 3. MANEJO DE FICHEROS 2. Formas de acceso a un fichero. Clases asociadas. Algunos métodos importantes del objeto File son:  getName: devuelve el nombre del fichero o directorio.  getPath(): devuelve el camino relativo.  getAbsolutePath(): devuelve el camino absoluto del fichero/directorio.  canRead(): devuelve true si el fichero se puede leer.  canWrite(): devuelve true si el fichero se puede escribir.  length(): nos devuelve el tamaño del fichero en bytes.  createNewFile(): crea un nuevo fichero, vacío, asociado a File si y solo si no existe un fichero con dicho nombre.
  12. 12. UT 3. MANEJO DE FICHEROS 2. Formas de acceso a un fichero. Clases asociadas.  delete(): borra el fichero o directorio asociado al File.  exists(): devuelve true si el fichero/directorio existe.  getParent(): devuelve el nombre del directorio padre, o null si no existe.  isDirectory(): devuelve true si el objeto File corresponde a un directorio.  isFile(): devuelve true si el objeto File corresponde a un fichero normal.  mkdir(): crea un directorio con el nombre indicado en la creación del objeto File.  renameTo(File nuevonombre): renombra el fichero.
  13. 13. UT 3. MANEJO DE FICHEROS 2. Formas de acceso a un fichero. Clases asociadas. Ejemplos de uso de la clase Clase File.  Código para la creación de un objeto File con un fichero llamado libros.xml File f = new File(“proyectolibros.xml”);  Ejemplo de uso del objeto File System.out.println (“Nombre: “ + f.getName()); System.out.println (“Directorio padre: “ + f.getParent()); System.out.println (“Ruta relativa: “ + f.getPath()); System.out.println (“Ruta absoluta: “ + f.getAbsolutePath());
  14. 14. UT 3. MANEJO DE FICHEROS 3. Flujos o Streams. Tipos. En Java, el acceso a ficheros es tratado como un flujo de información entre el programa y el fichero. Un flujo no es más que un objeto que hace de intermediario entre el programa y el origen o el destino de la información. Esta abstracción proporcionada por los flujos hace que los programadores, cuando quieren acceder a información, solo se tengan que preocupar por trabajar con los objetos que proporcionan el flujo, sin importar el origen o el destino concreto de donde vengan o vayan los datos. Cualquier programa que tenga que obtener información de cualquier fuente necesita abrir un stream, igualmente si necesita enviar información abrirá un stream y se escribirá la información. La vinculación de este stream con el dispositivo físico la hace el sistema de entrada/salida de Java.
  15. 15. UT 3. MANEJO DE FICHEROS 3. Flujos o Streams. Tipos. Tenemos dos tipos de flujos:  Flujos de bytes (8 bits): su uso está orientado a la lectura/escritura de datos binarios. Todas las clases de flujos de bytes descienden de las clases InputStream y OutputStream.  Flujos de caracteres (16 bits): realizan operaciones de entrada y salida de caracteres. El flujo de caracteres viene gobernado por las clases Reader y Writer.
  16. 16. UT 3. MANEJO DE FICHEROS 3.1. Flujos de bytes. FileInputStream LineNumberInputStream FileOutputStream PipedInputStream FilterInputStream BufferedInputStream ByteArrayInputStream OutputStream InputStream DataInputStream PipedOutputStream PrintStream FilterOutputStream DataOutputStream ByteArrayOutputStream BufferedOutputStream PushbackInputStream SequenceInputStream StringBufferInputStream
  17. 17. UT 3. MANEJO DE FICHEROS 3.2. Flujos de caracteres. BufferedReader BufferedWriter LineNumberReder CharArrayWriter CharArrayReader OutputStreamReader FileReader Writer Reader InputStreamReader FilterReader FilterWriter PushbackReader PipedWriter PipedReader StringWriter StringReader PrintWriter FileWriter
  18. 18. UT 3. MANEJO DE FICHEROS 4. Formas de acceso a un fichero. Hay dos formas de acceso a la información almacenada en un fichero:  Acceso secuencial: los datos o registros se leen y se escriben en orden. Si se quiere acceder a un dato es necesario leer antes todos los anteriores. La escritura de datos se hace a partir del último dato escrito, no es posible hacer inserciones entre los datos que ya hay escritos.  Acceso directo o aleatorio: permite acceder directamente a un datos o registro sin necesidad de leer los anteriores y se puede acceder a la información en cualquier orden. Los datos están almacenados en registros de tamaño conocido y nos podemos mover de un registro a otro de forma aleatoria para leerlos o modificarlos.
  19. 19. UT 3. MANEJO DE FICHEROS 4. Formas de acceso a un fichero
  20. 20. UT 3. MANEJO DE FICHEROS 5. Operaciones sobre ficheros. Operaciones básicas sobre ficheros:  Creación del fichero.  Apertura del fichero.  Cierre del fichero  Lectura de los datos del fichero  Escritura de los datos en el fichero
  21. 21. UT 3. MANEJO DE FICHEROS 5.1. Operaciones sobre ficheros secuenciales. En los ficheros secuenciales los registros se insertan en orden cronológico. Si hay que añadir nuevos registros éstos se añaden a partir del final del fichero:  Consultas: .para consultar un determinado registro es necesario empezar la lectura desde el primer registro, y continuar leyendo secuencialmente hasta localizar el registro buscado.  Altas: las altas se realizan al final del último registro insertado, sólo se permite añadir datos al final del fichero.  Bajas: para dar de baja un registro es necesario hacer uso de un fichero auxiliar, leyendo todos los registros y copiarlos todos a excepción del que queramos dar de baja. Por último renombraremos el fichero auziliar dándole el nombre del fichero original.  Modificaciones: El proceso de modificaciones es similar al de bajas.
  22. 22. UT 3. MANEJO DE FICHEROS 5.2. Operaciones sobre ficheros aleatorios. Normalmente para posicionarnos en un registro es necesario aplicar una función de conversión que usualmente tiene que ver con el tamaño del registro y con la clave del mismo. Veamos cómo se realizan las operaciones típicas:  Consultas: .para consultar un determinado registro necesitamos saber su clave y aplicar la función de conversión para obtener la dirección del registro que queremos leer.  Altas: para insertar un registro necesitamos saber su clave, aplicar la función de conversión a la clave para obtener la dirección y escribir el registro en la posición devuelta. Si la posición está ocupada por otro registro, el registro se insertaría en la zona de excedentes.  Bajas: para realizar las bajas se suele utilizar un campo del registro a modo de switch que tenga el valor 1 cuando el registro exista y le damos el valor 0 para darle de baja. Físicamente el registro no desaparece del disco.  Modificaciones: Para modificar un registro hay que localizarlo, modificar los datos que nos interesen y reescribir el registro en esa posición.
  23. 23. UT 3. MANEJO DE FICHEROS 6.1. Clases para gestión de flujos de datos. Ficheros de Texto. Clase FileReader El flujo FileReader permite leer caracteres desde un fichero de modo secuencial. Esta clase hereda los métodos de la clase Reader. Los constructores principales son: FileReader(String ruta) FileReader(File fichero) El fichero puede abrirse con una ruta de directorios o con un objeto de tipo File. Al usar la clase FileReader se puede generar la excepción FileNotFoundException.
  24. 24. UT 3. MANEJO DE FICHEROS 6.1. Clases para gestión de flujos de datos. Ficheros de Texto. Clase FileReader Los métodos que proporciona la clase FileReader son los siguientes:  int read(): lee un carácter y lo devuelve  int read(char[] buf): lee hasta buf.length caracteres de datos de una matriz de caracteres (buf). Los caracteres leídos se van almacenando en buf.  int read(char[] buf. Int desplazamiento, int n): lee hasta n caracteres de datos de la matriz buf comenzando por buf[desplazamiento] y devuelve el número leído de caracteres.
  25. 25. UT 3. MANEJO DE FICHEROS 6.1. Clases para gestión de flujos de datos. Ficheros de Texto. Clase FileReader import java.io.*; public class LeerFichTexto { public static void main (String[] args) throws IOException { //declarar fichero File fichero = new File(“C:EJERCICIOSLeerFicheroTexto.java”); FileReader fic = new FileReader(fichero); //Crear el flujo de entrada int i; while ((i = fic.read()) != -1) //Se va leyendo un carácter System.out.println((char) i); fic.close(); //cerrar fichero } }
  26. 26. UT 3. MANEJO DE FICHEROS 6.1. Clases para gestión de flujos de datos. Ficheros de Texto. FileReader no contiene métodos que nos permitan leer líneas completas, pero BufferedReader sí; dispone del método readLine() que lee una línea del fichero y la devuelve, o devuelve null si no hay nada que leer o llegamos al final del fichero. Para construir un BufferedReader necesitamos la clase FileReader: BufferedReader fichero = new BufferedReader(new FileReader(NombreFichero));
  27. 27. UT 3. MANEJO DE FICHEROS 6.1. Clases para gestión de flujos de datos. Ficheros de Texto. Clase FileWriter El flujo FileWriter permite escribir caracteres en un fichero de modo secuencial. Esta clase hereda los métodos necesarios para ello de la clase Writer. Los constructores principales son: FileWriter (String ruta, boolean añadir) FileWriter(File fichero) El parámetro ruta indica la localización del archivo en el sistema operativo. El parámetro añadir igual a true indica que el fichero se usa para añadir datos a un fichero ya existente.
  28. 28. UT 3. MANEJO DE FICHEROS 6.1. Clases para gestión de flujos de datos. Ficheros de Texto. Clase FileWriter Los métodos que proporciona la clase FileWriter son:  void write(int c): escribe un carácter  void write(char[] buf): escribe un array de caracteres  void write(char[] buf, int desplazamiento, int n): escribe n caracteres de datos en la matriz buf y comenzando por buf[desplazamiento].  void write(String str): escribe una cadena de caracteres  append(char c): añade un carácter a un fichero Estos métodos también pueden lanzar la excepción IOException.
  29. 29. UT 3. MANEJO DE FICHEROS 6.1. Clases para gestión de flujos de datos. Ficheros de Texto. La clase BufferedWriter también deriva de la clase Writer. Esta clase añade un buffer para realizar una escritura eficiente de caracteres. Para construir un BufferedWriter necesitamos un FileWriter: BufferedWriter fichero = new BufferedWriter(new FileWriter(NombreFichero)); La clase PrintWriter posee los métodos print(String) y println(String) para escribir en un fichero. Ambos reciben un String y los escriben en un fichero, el segundo método salta de línea. Para escribir un PrintWriter necesitamos la clase FileWriter: PrintWriter fichero = new PrintWriter(new FileWriter(NombreFichero));
  30. 30. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Los ficheros binarios almacenan secuencias de dígitos binarios que no son legibles directamente por el usuario como ocurría con los ficheros de texto. Tienen la ventaja de que ocupan menos espacio en el disco. En Java, las dos clases que nos permiten trabajar con ficheros binarios son FileInputStream y FileOutputStream.
  31. 31. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Clase FileInputStream El flujo FileInputStream permite leer bytes en un fichero de manera secuencial. Sus constructores tienen los mismos parámetros que los mostrados para FileReader. Los métodos que proporciona la clase FileInputStream son similares a los vistos para FileReader. Estos métodos devuelven el número de bytes leídos o -1 si se ha llegado al final del fichero:  int read()  int read(byte[] b)  int read(byte[] b, int desplazamiento, int n)
  32. 32. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Clase FileOutpuStream El flujo FileOutputStream permite escribir bytes en un fichero de manera secuencial. Sus constructores tienen los mismos parámetros que los mostrados para FileWriter: el fichero puede ser abierto vacío o listo para añadirle datos a los que ya contenga. Los métodos que proporciona la clase FileOutputStream son:  void write(int b)  void write(byte[] b)  void write(byte[] b, int desplazamiento, int n)
  33. 33. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Para leer y escribir datos de tipos primitivos: int, float, long,… usaremos las clases DataInputStream y DataOutputStream. Estas clases además de los métodos read() y write() proporcionan otros métodos de lectura y escritura: MÉTODOS PARA LECTURA MÉTODOS PARA ESCRITURA boolean readBoolean(); byte readByte(); int readUnsignedByte(); int readUnsignedShort(); short readShort(); char readChar(); int readInt(); long readLong(); float readFloat(); double readDouble(); String readUTF(); void writeBoolean(boolean v); void writeByte(int v); void writeUnsignedByte(String s); void writeShort(int v); void writeChars(String s); void writeChar(int v); void writeInt(int v); void writeLong(long v); void writeFloat(float v); void writeDouble(doublé v); void writeUTF(String str);
  34. 34. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Para abrir un objeto DataInputStream lo haremos de la siguiente forma: File fichero = new File(“nombrefichero”); FileInputStream filein = new FileInputStream(fichero); DataInputStream dataIS = new DataInputStream(filein); Para abrir un objeto DataOutputStream lo haremos de la siguiente forma: File fichero = new File(“nombrefichero”); FileOutputStream fileout = new FileOutputStream(fichero); DataOutputStream dataOS = new DataOutputStream(fileout);
  35. 35. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Objetos serializables. OBJETOS SERIALIZABLES Con lo visto hasta ahora, si, por ejemplo, tenemos un objeto de tipo empleado con varios atributos (nombre, dirección, salario, departamento,…) y queremos guardarlo en un fichero, tendríamos que guardar cada atributo que forma parte del objeto por separado. Java nos permite guardar objetos en ficheros binarios; para poder hacerlo, el objeto tiene que implementar la interfaz Serializable que dispone de una serie de métodos con los que podremos guardar y leer objetos en ficheros binarios. Los más importantes son:  void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException: para leer un objeto.  void writeObject(java.io.ObjecOutputStream stream) throws IOException: para escribir un objeto. Para leer y escribir objetos serializables a un stream se utilizan las clases Java ObjectInputStream y ObjectOutputStream respectivamente.
  36. 36. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Objetos serializables. OBJETOS SERIALIZABLES A continuación se muestra la clase Persona que implementa la interfaz Serializable y que utilizaremos para escribir y leer objetos en un fichero binario.
  37. 37. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Objetos serializables. OBJETOS SERIALIZABLES El siguiente ejemplo escribe objetos Persona en un fichero. Necesitamos crear un flujo de salida FileOutputStream y a continuación se crea el flujo de salida ObjectOutputStream, que es el que procesa los datos. El método writeObject() escribe los objetos al flujo de salida y los guarda en un fichero.
  38. 38. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Objetos serializables. OBJETOS SERIALIZABLES Para leer objetos Persona de un fichero necesitamos el flujo de entrada a disco FileInputStream y a continuación crear el flujo de entrada ObjectInputStream, que es el que procesa los datos. El método readObject() lee los objetos del flujo de entrada y puede lanzar la excepción ClassNotFoundException.
  39. 39. UT 3. MANEJO DE FICHEROS 6.2. Clases para gestión de flujos de datos. Ficheros binarios. Objetos serializables. OBJETOS SERIALIZABLES ObjectOutputStream puede darnos algunos problemas, por ejemplo, si escribimos datos en el fichero y lo cerramos. Después volvemos a abrirlo para añadir datos y entonces se escribe una nueva cabecera al final de los objetos introducidos anteriormente y después se van añadiendo el resto de los datos. Esto origina el problema que al leer el fichero se produzca la excepción StreamCorruptedException.
  40. 40. UT 3. MANEJO DE FICHEROS 6.3. Ficheros de acceso aleatorio. Java dispone de la clase RandomAccessFile que contiene métodos para acceder al contenido de un fichero binario de forma aleatoria y para posicionarnos en una posición concreta del mismo. Disponemos de dos posibilidades para crear el fichero de acceso aleatorio:  Escribiendo el nombre del fichero: fichero = new RandomAccessFile(String nombre, String modoAcceso);  Con un objeto File: fichero = new RandomAccessFile(File fich, String modoAcceso); El argumento modoAcceso puede ser “r” para solo lectura o “rw” para lectura y escritura. La clase RandomAccessFile maneja un puntero que indica la posición actual en el fichero. Cuando el fichero se crea el puntero se coloca en 0. Las sucesivas llamadas a los métodos read() y write() ajustan el puntero según la cantidad de bytes leídos o escritos.
  41. 41. UT 3. MANEJO DE FICHEROS 6.3. Ficheros de acceso aleatorio. Los métodos más importantes son:  long getFilePointer(): devuelve la posición actual del puntero del fichero.  void seek(long posicion): coloca el puntero del fichero en una posición determinada desde el comienzo del mismo.  long length(): devuelve el tamaño del fichero en bytes. La posición length() marca el final del fichero.  int skipBytes(int desplazamiento): desplaza el puntero desde la posición actual el número de bytes indicados en desplazamiento.
  42. 42. UT 3. MANEJO DE FICHEROS 6.3. Ficheros de acceso aleatorio. A continuación vamos a ver un ejemplo de un programa que escribe un fichero aleatorio con los datos de empleados, teniendo en cuenta las siguientes consideraciones:  Los datos a insertar son: apellido, departamento y salario.  Los datos se van introduciendo de forma secuencial, no se usará el método seek().  Por cada empleado también se insertará un identificador que coincidirá con el índice +1 con el que se recorren los arrays  La longitud del registro de cada empleado es la misma (36 bytes) y los tipos que se insertan y su tamaño en bytes es el siguiente:  Identificador: es un entero, ocupa 4 bytes  Apellido: cadena de 10 caracteres. Cada carácter Unicode ocupa 2 bytes, luego el apellido ocupa 20 bytes  Departamento: es un entero, ocupa 4 bytes.  Salario: es un doublé, ocupa 8 bytes. Nota: Tamaño de otros tipos: short (2 bytes), byte (1 byte), long (8 bytes), boolean (1 bit), float (4 bytes), etc.
  43. 43. UT 3. MANEJO DE FICHEROS 6.3. Ficheros de acceso aleatorio.
  44. 44. UT 3. MANEJO DE FICHEROS 6.3. Ficheros de acceso aleatorio.
  45. 45. UT 3. MANEJO DE FICHEROS 6.3. Ficheros de acceso aleatorio. Para insertar un nuevo registro aplicamos la función de conversión al identificador para calcular la posición. El siguiente código inserta un empleado con identificador 20. Se ha de calcular la posición donde irá el registro dentro del fichero (identificador -1) * 36 bytes.
  46. 46. UT 3. MANEJO DE FICHEROS 7. Trabajo con ficheros XML. El lenguaje XML (eXtended Markup Language [lenguaje de marcas extendido])  Representa la información de forma neutra, independiente del lenguaje de programación y del sistema operativo empleado.  Util en el desarrollo de aplicaciones software.  Se han diseñado muchas tecnologías gracias a las posibilidades ofrecidas por XML, un ejemplo de ellas son los servicios web.  Desde un punto de vista a “bajo nivel”, un documento XML no es otra cosa que un fichero de texto. Realmente nada impide utilizar librerías de acceso a ficheros, como las vistas en la sección anterior, para acceder y manipular ficheros XML.  Desde un punto de vista a “alto nivel”, un documento XML no es un mero fichero de texto.
  47. 47. UT 3. MANEJO DE FICHEROS 7. Trabajo con ficheros XML. Estructura XML. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE Mensaje SYSTEM "Mensaje.dtd"> <Mensaje> <Remitente> <Nombre>Anuska Esteban</Nombre> <Mail> anuska.informática@gmail.com </Mail> </Remitente> <Destinatario> <Nombre>Pepito de los Palotes</Nombre> <Mail>pepito.palotes@correo.es</Mail> </Destinatario> <Texto> <Asunto> Este es el asunto del mensaje. </Asunto> <Parrafo> Este es mi documento con una estructura muy sencilla no contiene atributos ni entidades... </Parrafo> </Texto> </Mensaje>
  48. 48. UT 3. MANEJO DE FICHEROS 7. Trabajo con ficheros XML. Estructura XML. Este mismo documento puede ser visto de forma gráfica, para comprender mejor la estructura de un documento XML. Nombre: Anuska Esteban Remitente Mail: anuska.informática@gmail.com Nombre: Pepito Palotes Mensaje Destinatario Mail: pepito.palotes@correo.es Asunto: Este es el asunto… Texto Parrafo: Este es mi documento…
  49. 49. UT 3. MANEJO DE FICHEROS 7. Trabajo con ficheros XML. Parsers. Son necesarias herramientas específicas (librerías) para acceder y manipular este tipo de archivos de manera potente, flexible y eficiente.     Reducen los tiempos de desarrollo de aplicaciones Optimizan los propios accesos a XML. Permiten manejar los documentos XML de forma simple y sin cargar innecesariamente el sistema. Las herramientas que leen el lenguaje XML y comprueban si el documento es válido sintácticamente se denominan analizadores sintácticos o parsers. Los dos parsers más conocidos: DOM y SAX
  50. 50. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM. La tecnología DOM (Document Object Model) es una interfaz de programación que permite analizar y manipular dinámicamente y de manera global el contenido, el estilo y la estructura de un documento. Para trabajar con un documento XML primero se almacena en memoria en forma de árbol con nodos padre, nodos hijo y nodos finales que son aquellos que no tienen descendientes. Una vez creada en memoria esta estructura, los métodos de DOM permiten recorrer los diferentes nodos del árbol y analizar a qué tipo particular pertenecen. En función del tipo de nodo, la interfaz ofrece una serie de funcionalidades u otras para poder trabajar con la información que contienen. DOM ofrece una manera de acceder a documentos XML tanto para ser leído como para ser modificado. Su único inconveniente es que en el árbol DOM se crea todo en memoria principal, por lo que si el documento XML es muy grande, la creación y manipulación de DOM sería intratable.
  51. 51. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM. Para poder trabajar con DOM en Java necesitamos las clases e interfaces que componen el paquete org.w3c.dom y el paquete javax.xml.parsers. Estas clases ofrecen métodos para cargar documentos desde una fuente de datos. Contiene dos clases fundamentales:  DocumentBuilder  DocumentBuilderFactory DOM no define ningún mecanismo para generar un fichero XML a partir de un árbol DOM. Para eso usaremos el paquete javax.xml.transform que permite especificar una fuente y un resultado.
  52. 52. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM. Los programas Java que utilicen DOM necesitan estas interfaces:  Document. Es un objeto que equivale a un ejemplar de un documento XML. Permite crear nuevos nodos en el documento.  Element. Cada elemento del documento XML tiene un equivalente en un objeto de este tipo. Expone propiedades y métodos para manipular los elementos del documento y sus atributos.  Node. Representa a cualquier nodo del documento.  NodeList. Contiene una lista con los nodos hijos de un nodo.  Attr. Permite acceder a los atributos de un nodo.  Text. Son los datos carácter de un elemento.  CharacterData. Representa a los datos carácter presentes en el documento.  DocumentType. Proporciona información contenida en la etiqueta <!DOCTYPE>
  53. 53. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM. Vamos a ver un ejemplo en el que vamos a crear un fichero XML a partir del fichero aleatorio de empleados creado en el epígrafe anterior:
  54. 54. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM.
  55. 55. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM.
  56. 56. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM. Para leer un documento XML, creamos una instancia de DocumentBuilderFactory para construir el pasrser y cargamos el documento con el método parse():
  57. 57. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM.
  58. 58. UT 3. MANEJO DE FICHEROS 7.1. Trabajo con ficheros XML. Acceso a datos con DOM.
  59. 59. UT 3. MANEJO DE FICHEROS 7.2. Trabajo con ficheros XML. Acceso a datos con SAX. SAX (API Simple para XML) es un conjunto de clases e interfaces para el procesamiento de documentos XML.  Permite analizar los documentos de forma secuencial.  Poco consumo de memoria.  Impide tener una visión global del documento que se va a analizar.  SAX es más complejo de programar que DOM. La lectura de un documento XML produce eventos que ocasiona la llamada a métodos.
  60. 60. UT 3. MANEJO DE FICHEROS 7.2. Trabajo con ficheros XML. Acceso a datos con SAX. En la siguiente tabla podemos ver los elementos del documento XML y los métodos asociados a los eventos que producen.
  61. 61. UT 3. MANEJO DE FICHEROS 7.2. Trabajo con ficheros XML. Acceso a datos con SAX. Vamos a ver un ejemplo sencillo en Java que muestra los pasos básicos necesarios para hacer que se puedan tratar los eventos.
  62. 62. UT 3. MANEJO DE FICHEROS 7.2. Trabajo con ficheros XML. Acceso a datos con SAX.
  63. 63. UT 3. MANEJO DE FICHEROS 7.3. Serialización de objetos a XML  Serialización: Transforma los objetos Java en documentos XML en el disco.  Deserialización: Lee el fichero XML interpretándolo y generando los objetos. Para serializar objetos Java a XML y viceversa utilizaremos la librería Xstream. Para ello necesitaremos descargar los JAR desde http://xstream.codehaus.org/download.html Necesitaremos el fichero xstream.1.4.6.jar y el fichero kxml2-2.3.0.jar que se puede descargar desde el apartado Optional Dependencies.
  64. 64. UT 3. MANEJO DE FICHEROS 7.3. Serialización de objetos a XML En el siguiente ejemplo, vamos a serializar un objeto Java, creando un fichero XML. Partiremos del fichero Persona.dat para crear el objeto y a continuación usaremos la clase Xstream para crear el fichero XML.
  65. 65. UT 3. MANEJO DE FICHEROS 7.3. Serialización de objetos a XML
  66. 66. UT 3. MANEJO DE FICHEROS 7.3. Serialización de objetos a XML
  67. 67. UT 3. MANEJO DE FICHEROS 7.3. Serialización de objetos a XML El fichero generado tendrá el siguiente aspecto
  68. 68. UT 3. MANEJO DE FICHEROS 7.3. Serialización de objetos a XML A continuación se muestra el código utilizado para la deserialización:
  69. 69. UT 3. MANEJO DE FICHEROS 8. Excepciones: Detección y Tratamiento Un excepción es un evento que ocurre durante la ejecución del programa que interrumpe el flujo normal de las sentencias. Cuando no es capturada por el programa, se captura por el gestor de excepciones por defecto que devuelve un mensaje y detiene el programa. Las excepciones en Java son objetos de clases derivadas de la clase base Exception que a su vez es una clase derivada de la clase base Throwable.
  70. 70. UT 3. MANEJO DE FICHEROS 8.1. Capturar excepciones Para capturar una excepción se utiliza el bloque try-catch. Se encierra en el bloque try el código que puede generar una excepción, este bloque va seguido por uno o más bloques catch. Cada bloque catch especifica el tipo de excepción que puede atrapar y contiene un manejador de excepciones. Después del último bloque catch puede aparecer un bloque finally que siempre se ejecuta haya ocurrido o no la excepción. Para capturar cualquier excepción utilizaremos la clase base Exception. Si se usa habrá que ponerla al final de la lista de manejadores para evitar que los manejadores que vienen después queden ignorados.
  71. 71. UT 3. MANEJO DE FICHEROS 8.1. Capturar excepciones Para obtener más información sobre la excepción se puede llamar a los métodos de la clase base Throwable, algunos son:  String getMessage(): devuelve la cadena de error del objeto.  String getLocalizedMessage(): crea una descripción local de este objeto.  String toString(): devuelve una breve descripción del objeto.  void printStackTrace(), printStackTrace(PrintStream) o printStackTrace(PrintWriter): imprime el objeto y la traza de la pila de llamadas lanzada.
  72. 72. UT 3. MANEJO DE FICHEROS 8.2. Especificar excepciones Para especificar excepciones utilizamos la palabra clave throw, seguida de la lista de todos los tipos de excepciones potenciales; si un método decide no gestionar una excepción mediante try-catch, debe especificar que puede lanzar esa excepción. Aquellos métodos que pueden lanzar excepciones deben saber cuáles son esas excepciones en su declaración. Una forma de saberlo es compilando el programa, de esta forma nos aparecerán errores indicando las excepciones que no han sido declaradas o capturadas.

×