PERSISTENCIA BASADA EN ARCHIVOS

32
Persistencia basada en archivos

Transcript of PERSISTENCIA BASADA EN ARCHIVOS

Page 1: PERSISTENCIA BASADA EN ARCHIVOS

Persistencia basada en archivos

Page 2: PERSISTENCIA BASADA EN ARCHIVOS

Introducción

Todas las aplicaciones realizadas hasta ahora obtenían los datos necesarios para su ejecución de la entrada estándar y visualizaban los resultados en la salida estándar.

De esta forma los datos estarán disponibles mientras dure la ejecución de la aplicación. Si finalizamos la ejecución de la aplicación y la ejecutamos de nuevo, tendremos que volver a ingresar de nuevo todos los datos.

Page 3: PERSISTENCIA BASADA EN ARCHIVOS

… Introducción

La solución para hacer que los datos persistan de una ejecución a otra es almacenarlos en un archivo en el disco.

Entonces cada vez que se ejecute la aplicación podrá leer el archivo almacenado en disco y recuperar los datos que requiera, los mismos que serán cargarlos en la memoria y podrán ser manipularlos.

Page 4: PERSISTENCIA BASADA EN ARCHIVOS

Datos de una aplicación

Disco Vista

Controlador

Lee/Escribe

Modifica

Modifica

ActualizaModelo de datos

Page 5: PERSISTENCIA BASADA EN ARCHIVOS

Persistir datos de una aplicación

Como Java es un lenguaje orientado a objetos, la mayoría 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 aplicación debe tomar el modelo de datos de la memoria y escribirlo en disco.

Page 6: PERSISTENCIA BASADA EN ARCHIVOS

Archivos

Un archivo, también denominado “fichero”, es un conjunto de datos almacenados como una “unidad” en un soporte físico, por ejemplo un disco magnético 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).

Page 7: PERSISTENCIA BASADA EN ARCHIVOS

Ejemplos bajo Windows

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

Nombre corto:Balance.dat

Extensión:.dat

Ruta:C:\\Farmacia\\Datos\\

Page 8: PERSISTENCIA BASADA EN ARCHIVOS

Ejemplos bajo UNIX/Linux

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

Nombre corto:Balance.dat

Extensión:.dat

Ruta:home/ccp/farmacia/datos/

Page 9: PERSISTENCIA BASADA EN ARCHIVOS

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.

Básicamente, 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 través de esta clase podemos manipular los atributos de los elementos referenciados.

Page 10: PERSISTENCIA BASADA EN ARCHIVOS

Métodos de la clase File - Directorios

Método Descripciónboolean isDirectory()

Investiga si es un directorio.

boolean exist() Investiga si existe el directorio.boolean mkdir() Crea un directorio.boolean mkdirs() Crear los directorios necesarios de

una ruta.boolean delete() Borra un directorio.String[] list() Lista archivos de un directorio.File[] listRoots() Lista cada uno de los sistemas de

archivos disponibles.

Page 11: PERSISTENCIA BASADA EN ARCHIVOS

Métodos de la clase File - Archivos

Método Descripciónboolean isFile() Investiga si es un archivo.

boolean exist() Investiga si existe el archivo.

boolean canRead() Investiga si se puede leer el archivo.

boolean canWrite() Investiga si se puede escribir el archivo.

long length() Tamaño del archivo en bytes.

long lastModified() Fecha de la última modificación.

boolean renameTo() Cambia el nombre del archivo.

boolean delete() Borra un archivo.

Page 12: PERSISTENCIA BASADA EN ARCHIVOS

Ejemplo

File[] roots = File.listRoots();

for (File r : roots) {System.out.println(r);

}

Page 13: PERSISTENCIA BASADA EN ARCHIVOS

Ejemplo

File dir = new File("/home/ccp/");

String files = dir.list();

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

}

Page 14: PERSISTENCIA BASADA EN ARCHIVOS

Flujos de Entrada/Salida

La escritura y lectura de archivos en Java se basa en “flujos” de datos.

Un flujo no es más que un objeto que hace de intermediario entre la aplicación y el origen o el destino de los datos.

De esta forma la aplicación leerá o escribirá en el flujo sin importarle desde donde vienen los datos o hacia donde van.

Page 15: PERSISTENCIA BASADA EN ARCHIVOS

Visión general de los flujos E/S

Aplicación Archivo

La aplicación lee datos del archivo

Flujo de entrada

Aplicación Archivo

La aplicación escribe datos en el archivo

Flujo de salida

Page 16: PERSISTENCIA BASADA EN ARCHIVOS

Filtros

Existen otras clases que también 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, podríamos tener un filtro que convierta a mayúsculas todo el texto y que trabaje con flujos asociados a archivos, memoria o cualquier otro destino.

Page 17: PERSISTENCIA BASADA EN ARCHIVOS

Flujos de entrada de caracteres

Page 18: PERSISTENCIA BASADA EN ARCHIVOS

Flujos de salida de caracteres

Page 19: PERSISTENCIA BASADA EN ARCHIVOS

Flujos de entrada binarios

Page 20: PERSISTENCIA BASADA EN ARCHIVOS

Flujos de salida binarios

Page 21: PERSISTENCIA BASADA EN ARCHIVOS

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 codificación local por defecto.

Page 22: PERSISTENCIA BASADA EN ARCHIVOS

Subclases de Reader y Writer

Subclase DescripciónFileReader Crea flujos de bytes procedentes de archivos

de caracteres.

BufferedReader Crea un filtro con área de almacenamiento en memoria (buffer) con lo que permite la lectura de bloques mayores a un byte.

FileWriter Crear flujos de bytes para enviar datos a un archivo.

BufferedWriter Crear un filtro con área de almacenamiento en memoria (buffer) con lo que permite la escritura de bloques mayores a un byte.

Page 23: PERSISTENCIA BASADA EN ARCHIVOS

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();

}

Page 24: PERSISTENCIA BASADA EN ARCHIVOS

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();

}

Page 25: PERSISTENCIA BASADA EN ARCHIVOS

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();

}

Page 26: PERSISTENCIA BASADA EN ARCHIVOS

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 través de flujos de bytes (conocidos como streams).

Page 27: PERSISTENCIA BASADA EN ARCHIVOS

Subclases de InputStream y OutputStream

Subclase DescripciónFileInputStream Abre un archivo para lectura.

FileOutputStream Abre un archivo para escritura.

DataInputStream Lee un flujo de bytes y lo convierte en primitivas válidas de Java.

DataOutputStream Convierte primitivas válidas de Java y lo escribe como un flujo de bytes.

ObjectInputStream Lee desde un archivo la estructura de un objeto.

ObjectOutputStream Escribe en un archivo la estructura de un objeto.

ByteArrayInputStream Lee un arreglo de bytes como si fuera un archivo.

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

Page 28: PERSISTENCIA BASADA EN ARCHIVOS

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();

}

Page 29: PERSISTENCIA BASADA EN ARCHIVOS

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();

}

Page 30: PERSISTENCIA BASADA EN ARCHIVOS

Serialización

La serialización es el proceso por el cual un objeto o una colección de objetos se convierten en una secuencia de bytes, los que pueden ser almacenados en un archivo y recuperados más 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.

Page 31: PERSISTENCIA BASADA EN ARCHIVOS

Ejemplo

import java.io.Serializable;

public class Persona implements Serializable {private String apellidos;private String nombres;private char sexo;private int edad;

.

.

.}

Page 32: PERSISTENCIA BASADA EN ARCHIVOS

Muchas gracias por su atención.