You are on page 1of 32

Persistencia basada en archivos

Ing. Carlos Castillo Peralta

Introduccin
Todas las aplicaciones realizadas hasta ahora obtenan los datos necesarios para su ejecucin de la entrada estndar y visualizaban los resultados en la salida estndar. De esta forma los datos estarn disponibles mientras dure la ejecucin de la aplicacin. Si finalizamos la ejecucin de la aplicacin y la ejecutamos de nuevo, tendremos que volver a ingresar de nuevo todos los datos.
Ing. Carlos Castillo Peralta

Introduccin
La solucin para hacer que los datos persistan de una ejecucin a otra es almacenarlos en un archivo en el disco. Entonces cada vez que se ejecute la aplicacin podr leer el archivo almacenado en disco y recuperar los datos que requiera, los mismos que sern cargarlos en la memoria y podrn ser manipularlos.
Ing. Carlos Castillo Peralta

Datos de una aplicacin

Disco

Modelo de datos Lee/Escribe

Actualiza

Vista

Modifica Modifica Controlador

Ing. Carlos Castillo Peralta

Persistir datos de una aplicacin


Como Java es un lenguaje orientado a objetos, la mayora de aplicaciones tienen un conjunto de clases de datos (modelo de datos). En la memoria residen las instancias de estas clases de datos y los componentes de vista y controlador (interfaz de usuario). Para almacenar los datos de forma permanente una aplicacin debe tomar el modelo de datos de la memoria y escribirlo en disco.
Ing. Carlos Castillo Peralta

Archivos
Un archivo, tambin denominado fichero, es un conjunto de datos almacenados como una unidad en un soporte fsico, por ejemplo un disco magntico o un CD. Los datos almacenados en un archivo son de manera permanente de modo que pueden ser manipulados en cualquier momento. Cada archivo est referenciado mediante un identificador nico (ruta + nombre).
Ing. Carlos Castillo Peralta

Ejemplos bajo Windows


Nombre completo:
C:\\Farmacia\\Datos\\Balance.dat

Nombre corto:
Balance.dat

Extensin:
.dat

Ruta:
C:\\Farmacia\\Datos\\
Ing. Carlos Castillo Peralta

Ejemplos bajo UNIX/Linux


Nombre completo:
home/ccp/farmacia/datos/Balance.dat

Nombre corto:
Balance.dat

Extensin:
.dat

Ruta:
home/ccp/farmacia/datos/
Ing. Carlos Castillo Peralta

La clase File
Un objeto de la clase java.io.File permite referenciar un archivo o un directorio que puede existir en el sistema de archivos. Bsicamente, podemos ver los objetos de esta clase como una referencia al nombre del elemento del sistema de archivos, bien sea un archivo o directorio. A travs de esta clase podemos manipular los atributos de los elementos referenciados.
Ing. Carlos Castillo Peralta

Mtodos de la clase File - Directorios


Mtodo
boolean isDirectory() boolean exist() boolean mkdir() boolean mkdirs()

Descripcin
Investiga si es un directorio. Investiga si existe el directorio. Crea un directorio. Crear los directorios necesarios de una ruta.

boolean delete()
String[] list()

Borra un directorio.
Lista archivos de un directorio.

File[] listRoots()

Lista cada uno de los sistemas de archivos disponibles.

Ing. Carlos Castillo Peralta

Mtodos de la clase File - Archivos


Mtodo
boolean isFile()
boolean exist() boolean canRead()

Descripcin
Investiga si es un archivo.
Investiga si existe el archivo. Investiga si se puede leer el archivo.

boolean canWrite()
long length() long lastModified()

Investiga si se puede escribir el archivo.


Tamao del archivo en bytes.

Fecha de la ltima modificacin. Cambia el nombre del archivo.


Borra un archivo.

boolean renameTo()
boolean delete()

Ing. Carlos Castillo Peralta

Ejemplo
File[] roots = File.listRoots();
for (File r : roots) { System.out.println(r); }

Ing. Carlos Castillo Peralta

Ejemplo
File dir = new File("/home/ccp/");
String files = dir.list();

for (String f : files) { System.out.println(f); }

Ing. Carlos Castillo Peralta

Flujos de Entrada/Salida
La escritura y lectura de archivos en Java se basa en flujos de datos. Un flujo no es ms que un objeto que hace de intermediario entre la aplicacin y el origen o el destino de los datos. De esta forma la aplicacin leer o escribir en el flujo sin importarle desde donde vienen los datos o hacia donde van.
Ing. Carlos Castillo Peralta

Visin general de los flujos E/S


La aplicacin lee datos del archivo Aplicacin Flujo de entrada Archivo

La aplicacin escribe datos en el archivo Aplicacin Flujo de salida Archivo

Ing. Carlos Castillo Peralta

Filtros
Existen otras clases que tambin representan flujos de datos, pero que se utilizan como un filtro previo a un flujo sobre un archivo o cualquier otro dispositivo. El uso habitual de estas clases es transformar los datos de otro flujo. Por ejemplo, podramos tener un filtro que convierta a maysculas todo el texto y que trabaje con flujos asociados a archivos, memoria o cualquier otro destino.
Ing. Carlos Castillo Peralta

Flujos de entrada de caracteres

Ing. Carlos Castillo Peralta

Flujos de salida de caracteres

Ing. Carlos Castillo Peralta

Flujos de entrada binarios

Ing. Carlos Castillo Peralta

Flujos de salida binarios

Ing. Carlos Castillo Peralta

Reader y Writer
Java proporciona las clases Reader y Writer, clases abstractas de las que derivan las clases que permiten crear flujos de caracteres de 16 bits (Unicode) mediante la codificacin local por defecto.

Ing. Carlos Castillo Peralta

Subclases de Reader y Writer


Subclase
FileReader BufferedReader

Descripcin
Crea flujos de bytes procedentes de archivos de caracteres. Crea un filtro con rea de almacenamiento en memoria (buffer) con lo que permite la lectura de bloques mayores a un byte. Crear flujos de bytes para enviar datos a un archivo. Crear un filtro con rea de almacenamiento en memoria (buffer) con lo que permite la escritura de bloques mayores a un byte.

FileWriter BufferedWriter

Ing. Carlos Castillo Peralta

Lectura de un archivo de texto


String texto = ""; try { FileReader fr = new FileReader("nombres.txt"); BufferedReader br = new BufferedReader(fr); while (texto != null) { texto = br.readLine(); if (texto != null) { System.out.println(texto); } } br.close(); } catch (IOException ex) { ex.printStackTrace(); }

Ing. Carlos Castillo Peralta

Escritura de un archivo de texto


String texto = {"Elena", "Carolina", "Carmen Nora"}; try { FileWriter fw = new FileWriter("nombres.txt", false); BufferedWriter bw = new BufferedWriter(fw); for (String t : texto) { bw.write(t); bw.newLine(); } bw.close(); } catch (IOException ex) { ex.printStackTrace(); }

Ing. Carlos Castillo Peralta

Lectura de un archivo con Scanner


try { File nombres = new File("nombres.txt"); Scanner sc = new Scanner(nombres); while (sc.hasNextLine()) { String texto = sc.readLine(); System.out.println(texto); } } catch (IOException ex) { ex.printStackTrace(); }

Ing. Carlos Castillo Peralta

InputStream y OutputStream
Java proporciona las clases InputStream y OutputStream, ambas clases abstractas de las que derivan las clases principales de lectura y escritura a travs de flujos de bytes (conocidos como streams).

Ing. Carlos Castillo Peralta

Subclases de InputStream y OutputStream


Subclase
FileInputStream FileOutputStream DataInputStream DataOutputStream ObjectInputStream ObjectOutputStream ByteArrayInputStream ByteArrayOutputStream

Descripcin
Abre un archivo para lectura. Abre un archivo para escritura. Lee un flujo de bytes y lo convierte en primitivas vlidas de Java. Convierte primitivas vlidas de Java y lo escribe como un flujo de bytes. Lee desde un archivo la estructura de un objeto. Escribe en un archivo la estructura de un objeto.

Lee un arreglo de bytes como si fuera un archivo.


Escribe en un arreglo de bytes como si fuera un archivo.

Ing. Carlos Castillo Peralta

Escritura de un archivo binario


try { FileOutputStream fos = new FileOutputStream("datos.bin"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject( new Persona("Castro", "Aquiles", 'M', 21) ); oos.close(); } catch (IOException ex) { ex.printStackTrace(); }

Ing. Carlos Castillo Peralta

Lectura de un archivo binario


try { FileInputStream fis = new FileInputStream("datos.bin"); ObjectInputStream ois = new ObjectInputStream(fis); Persona persona = (Persona) ois.readObject(); System.out.println(persona.getNombres() + " " + persona.getApellidos()); System.out.println(persona.getSexo()); System.out.println(persona.getEdad()); ois.close(); } catch (IOException ex) { ex.printStackTrace(); }

Ing. Carlos Castillo Peralta

Serializacin
La serializacin es el proceso por el cual un objeto o una coleccin de objetos se convierten en una secuencia de bytes, los que pueden ser almacenados en un archivo y recuperados ms adelante. Cuando se serializa un objeto se almacena la estructura de la clase y los datos contenidos. Para serializar y deserializar objetos se usa la interfaz java.io.Serializable.
Ing. Carlos Castillo Peralta

Ejemplo
import java.io.Serializable; public class Persona implements Serializable { private String apellidos; private String nombres; private char sexo; private int edad; . . . }

Ing. Carlos Castillo Peralta

Muchas gracias por su atencin.

You might also like