IFC06CM15 CURSO ACCESO A DATOS
LAURA LOZANO CALVO
Contenidos
1. java.nio vs java.io
2. java.nio.file – Clase Path
1. Operaciones con Path
3. java.nio.file – Clase Files
1. Lectura y escritura secuencial de archivos
1. Archivos pequeños
2. Streams para binarios
3. Buffers para texto
2. Lectura y escritura aleatoria de archivos
1. FileChannel de java.nio
2. RandomAcessFile de java.io
Contenidos
1. Serialización de objetos a archivo
1. Streams
2. Serialización de objetos a xml
1. Diferencias entre DOM, SAX, StAX, JAXB
2. API DOM
3. API JAXB
java.nio vs java.io
•I/O (Entrada/Salida) se refiere a la interfaz entre un ordenador y el
resto del mundo o entre un programa y el resto del ordenador.
•java.io es el paquete tradicional del API de Java para realizar
operaciones de I/O.
• Se basa en el “Stream”
•java.nio (Non- Blocking I/O) fue introducido en el API de Java desde
versión 1.4 como extensión eficiente a los paquetes java.io y java.ne
• Se basa en el “Buffer” y el “Channel”
java.nio vs java.io
java.io java.nio
Streams Buffers
I/O Bloqueante I/O No bloqueante (Channel y
Selector)
java.nio vs java.io
• Java I/O se proporciona conjuntamente entre los paquetes java.io and
java.nio. Entre los 2 proporcionan las siguientes caracterís cas:
• Entrada y salida con streams, serialización.
• Charsets, decodificadores y codificadores para caracteres.
• Acceso al Sistema de archivos, a los archivos y sus atributos.
• APIs para desarrollar servidores escalables con I/O asíncrona, mul plexad
y no bloqueante. (No lo abordamos en este curso)
java.nio vs java.io – buffer vs stream
Stream - java.io
•Es una secuencias de bytes, uno tras otro entre un origen y un des no.
•No se almacenan en ninguna parte
•Lo que se haga con los bytes es responsabilidad del programador
•No te puedes mover hacia adelante o hacia atrás en el Stream, necesitas almacenarlo en un
buffer primero
java.nio vs java.io – buffer vs stream
Buffer – java.nio
•Los bytes se almacenan directamente en un buffer
•Te puedes mover hacia adelante y hacia atrás en el buffer
•Hay que comprobar que el buffer ene todos los datos que necesitamos para procesar
•Si vamos a añadir más datos al buffer hay que asegurarse de no sobreescribir datos aún sin
procesar
java.nio vs java.io
– non-blocking vs blocking
blocking – java.io
•Los Stream son bloqueantes, por lo que cuando un hilo lee o escribe en un stream queda bloqueado hasta
que haya datos o se escriban.
•Mientras tanto el hilo no puede hacer otra cosa
Non- blocking – java.nio
•Un hilo puede leer o escribir en un canal (channel) de un buffer sin quedar bloqueado a la espera.
•Mientras tanto los hilos suelen hacer otras operaciones I/O en otros canales (archivos o conexiones de red
•Un único hilo puede ges onar múl ples canales de I/O
•U lizando selectores, un hilo puede monitorizar múl ples canales de entrada o de salida para ser no fica
cuando ocurren eventos de interés (seleccionar cuáles enen datos de entrada ó han acabado de escribir)
¿ java.nio ó java.io?
•Depende de lo que necesitemos pueden ser complementarios y u lizaremos conjuntamente am
paquetes.
•java.nio permite manejar múl ples canales (archivos o conexiones de red) con uno o unos poco
hilos.
•En java.nio el procesamiento de datos es más complicado que usar los streams bloqueantes de
java.io
•java.nio es la opción si necesito manejar cientos de conexiones (canales) abiertas y en cada una
manejar una pequeña can dad de datos.
• Servidor de chat, Red P2P …
•java.io es la opción si voy a manejar pocas conexiones con un alto ancho de banda (envío mucha
información a la vez)
java.nio.file vs java.io.File
• Hasta JSE7 java.io.File era la clase u lizada para realizar operaciones I/O con
archivos
• Esta clase tenía limitaciones como:
• Muchos métodos no lanzaban excepciones por lo que era muy complicado detectar y
resolver errores
• No permi a manejar enlaces simbólicos
• Presenta problemas de escalabilidad. Directorios largos provocaban problemas de
memoria e incluso de denegación de servicio
•El paquete java.nio.file incorporado a par r de JSE7 resuelve estos problemas.
• Es el que debemos usar para trabajar con archivos independientemente de si
realizamos I/O con streams (java.io) ó con buffers y channels (java.nio)
java.nio.file – La interfaz Path
•Para leer y escribir archivos tenemos que instanciar un objeto Path que represente la ruta
donde se ubica el archivo a leer o escribir
•Nos permite manejar rutas al es lo GNU/Linux y rutas al es lo Windows dependiendo de
SO en el que estemos trabajando
•Veamos como crear rutas
• CrearPath.java
Método Path.get es un atajo para
◦ Path p4 = FileSystems.getDefault().getPath("/users/sally");
◦ Path p4 = Path.get("/users/sally");
Ac vidad
•Prueba la clase crearPath.java y asegúrate de entenderla
•Cambia la línea Path p1 = Paths.get("D:/tmp/foo") por Path p1 = Paths.get("D
tmp\foo")
• ¿Qué ocurre? ¿Por qué?
• ¿Qué crees que ocurriría con el Path p4 si ejecutásemos en un SO GNU/Linux?
•Crea un objeto Path p5 que tenga la ruta al directorio Programas que está
ubicado en el directorio actual.
• La solución debe funcionar en cualquier SO
java.nio.file – La clase Path
•Operaciones con Path
• Recuperar partes de una ruta
• Eliminar redundancias de una ruta
• Conver r una ruta
• Unir dos rutas
• Crear una ruta rela va a otra dada
• Comparar dos rutas
API de Java
h ps://docs.oracle.com/javase/tutorial/essen al/io/pathOps.html
java.nio.file – La clase Files
•La clase Files nos va a permi r leer, escribir, manipular archivos y directorios a travé
de métodos está cos.
•Los métodos de la clase Files trabajan sobre objetos Path.
•Las operaciones principales a realizar con archivos y directorios son:
• Verificación de existencia y accesibilidad
• Borrar un archivo o directorio
• Copiar un archivo o directorio
• Mover un archivo o directorio
Ac vidades
•Para prac car operaciones con Archivos
• U liza la clase OperacionesFiles.java
• Lee el código y los comentarios, responde a las preguntas planteadas en el
código, ejecútalo y asegúrate de entenderlo.
•Para prac car operaciones con Path
• Ejercicios1.pdf
java.nio.file – La clase Files
•Lectura, escritura y creación de archivos.
java.nio.file – La clase Files
•Parámetro OpenOp ons:
• La mayoría de los métodos para trabajar con archivos reciben un parámetro llama
OpenOp ons. Es opcional y si no se especifica el método funcionará con su
comportamiento por defecto. Los valores principales que podemos darle a este
parámetro son:
• WRITE – Abre el archivo para escritura.
• APPEND – Añade datos al final de un archivo. Se usa junto con WRITE o CREATE.
• TRUNCATE_EXISTING – Trunca el archivo a 0 bytes. Se usa junto con WRITE.
• CREATE_NEW – Crea un archivo Nuevo y lanza una excepción si ya existe.
• CREATE – Abre el archive si existe o crea uno Nuevo si no existe.
• DELETE_ON_CLOSE – Borra el archive cuando se cierra el stream. Es ú l para archivos temporales
java.nio.file – La clase Files
•Archivos pequeños – Binario y texto:
• Podemos leer o escribir el contenido entero de una pasada. El método asegur
que el archivo se cierra al procesar todo el contenido o si se lanza una excepc
• Métodos readAllBytes, readAllLines, write
• ArchivosPequenosBytes.java
• ArchivosPequenosCaracteres.java
•Archivos Binarios o Texto sin Buffer – Lectura y Escritura Secuencial
• Clases InputStream y OutputStream (paquete java.io)
• ArchivoSecuencialSinBuffer.java
Ac vidad
•Crea un proyecto en Eclipse llamado Tema1 para todos los ejemplos y ac vidades de este tema
•Desarrolla y prueba los ejemplos de código anteriores y asegúrate de entenderlos
•¿Cúal es la diferencia entre ambos ejemplos?
•¿Dónde has ubicado el archivo de entrada “entrada.txt”? ¿Por qué?
•¿Dónde se han creado los archivos salida .txt y salida1.txt? ¿Por qué?
•Vuelve a probar ArchivosPequenosBytes.java pasándole como entrada cubo.png, la salida será cubo1.png
•Vuelve a probar ArchivosPequenosCaracteres.java pasándole como entrada cubo.png, la salida será cubo2.
•¿Puedes visualizar correctamente cubo1.png y cubo2.png? ¿Por qué?
•Ejecuta ArchivoSecuencialSinBuffer.java con entrada.txt (salida2.txt) y cubo.png (cubo3.png) ¿Los resultado
son los esperados?
java.nio.file – La clase Files
•Archivos de Texto con Buffer – Lectura y Escritura Secuencial
• U lizando streams con buffers para que sea más eficiente.
• Clases BufferedReader y BufferedWriter (paquete java.io)
• Métodos readLine, write
• ArchivoSecuencialLeer.java
• ArchivoSecuencialEscribir.java
• ArchivoSecuencialAnadir.java
Ac vidad
•Para prac car con Archivos
◦ Ejercicios2.pdf
java.nio.file – La clase Files
•Archivos de Texto – Acceso Aleatorio
• El acceso aleatorio nos permite leer o escribir en cualquier posición
• Un archivo son una ristra de bytes escritos en el disco duro y no se puede
"insertar" bytes entre medias. La única opción es reescribir el archivo comple
o, al menos, desde el si o en el que quieres insertar algo
• La clase Files proporciona acceso aleatorio a través de la interfaz SeekableByteChannel del
paquete java.nio que permite opciones avanzadas como mapeo en memoria del archivo pa
acceso más rápido o bloquear parte del archivo. El procesamiento de datos es muy comple
• Si no son necesarias estas caracterís cas avanzadas pude resultar más sencillo u lizar la cl
RandomAccesFile de java.io
• ArchivoAleatorioNIO.java
• ArchivoAleatroioIO.java
Serialización de objetos
• En OO interesa poder hacer los objetos persistentes y poderlos recuperar después
• La serialización de un objeto consiste en generar una secuencia de bytes que representan el
estado del objeto para poderlos almacenar o transmi r.
• La deserialización consiste en reconstruir el estado original del objeto a par r de los bytes
• Para que un objeto sea serializable debe implementar la interfaz Serializable
• Indica que se puede serializar no hay que implementar métodos
• public class Alumno implements Serializable {…}
• ObjectOutputStream y ObjectInputStream del paquete java.io permiten serializar/deserializar
forma automá ca
• Necesitamos adicionalmente InputStream y OutputStream de java.io para escribir/leer en arch
Ver AgendaSerializar.java
Ver AgendaDeserializar.java
Serialización de objetos
Archivos XML java – SAX, DOM y JAXB
• En Java disponemos de 3 APIS para procesar, serializar y desearializar objeto
java a archivos xml y viceversa.
• DOM
• se basa en un modelo de árbol de nodos definido por W3C
• Carga en memoria una representación del árbol de nodos para todo el documento
• Permite hacer búsquedas en el árbol
• Permite modificar el árbol y por tanto el documento xml
• Adecuado para leer/escribir fichero de configuración
• Se basa en las clases Document, Node, NodeList, Element, A r
Archivos XML java – SAX, DOM y JAXB
• En Java disponemos de 3 APIS para procesar, serializar y desearializar objetos java a archivos xml
viceversa.
• SAX
• se basa en un modelo de eventos
• U liza los eventos para avisarnos de la ocurrencias de tags (Eventos start, body y end tags )
• No crea ninguna estructura interna de nodos
• Sólo sirve partes del documento en un momento dado
• No permite modificar el XML
• No ene soporte para escribir XML (Hay que usar StAX)
• Sólo sirve para leer y procesar XML
• Adecuado para documentos muy largos cuando sólo nos interesan partes concretas
• Se basa en las clases ContentHandler, DTDHandler, En tyResolver y ErrorHandler.
Archivos XML java – SAX, DOM y JAXB
• En Java disponemos de 3 APIS para procesar, serializar y desearializar objetos
java a archivos xml y viceversa.
• JAXB (Java API for XML Binding)
• No es comparable a DOM ó SAX (APIs de bajo nivel)
• Es un API de alto nivel par mapear xml a objetos y viceversa
• No permite Xpath
• Adecuado cuando solo necesitamos des/serializar xml/objetos java sin necesidad de
procesar el xml
Archivos XML java –JAXB
• JAXB (Java API for XML Binding)
• Puesto que Java se basa en objetos es muy habitual mapear
objetos a xml y viceversa directamente
• Hay que tener en cuenta los mapeos de pos de datos por defect
entre Java y el esquema XML, para ello consultamos h ps://
docs.oracle.com/javase/tutorial/jaxb/intro/bind.html
• Si queremos customizar los mapeos se hace mediante anotacion
en línea en las clases java o en un archivo aparte
SerializarXMLDOM.ja
SerializarXMLJAXB.jav
Archivos XML java –JAXB
• JAXB (Java API for XML Binding)
Ac vidad
•Para prac car con Archivos de acceso aleatorio y serialización
◦ Ejercicios3.pdf
Referencias
1. Tutoriales oficiales de Oracle, h p://docs.oracle.com/javase/tutorial/essen al/io
2. API de Java, h p://docs.oracle.com/javase/8/docs/api/