PERSISTENCIA BASADA EN ARCHIVOS
-
Upload
darwin-durand -
Category
Education
-
view
5.478 -
download
5
Transcript of PERSISTENCIA BASADA EN ARCHIVOS
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.
… 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.
Datos de una aplicación
Disco Vista
Controlador
Lee/Escribe
Modifica
Modifica
ActualizaModelo de datos
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.
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).
Ejemplos bajo Windows
Nombre completo:C:\\Farmacia\\Datos\\Balance.dat
Nombre corto:Balance.dat
Extensión:.dat
Ruta:C:\\Farmacia\\Datos\\
Ejemplos bajo UNIX/Linux
Nombre completo:home/ccp/farmacia/datos/Balance.dat
Nombre corto:Balance.dat
Extensión:.dat
Ruta:home/ccp/farmacia/datos/
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.
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.
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.
Ejemplo
File[] roots = File.listRoots();
for (File r : roots) {System.out.println(r);
}
Ejemplo
File dir = new File("/home/ccp/");
String files = dir.list();
for (String f : files) {System.out.println(f);
}
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.
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
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.
Flujos de entrada de caracteres
Flujos de salida de caracteres
Flujos de entrada binarios
Flujos de salida binarios
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.
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.
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();
}
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();
}
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();
}
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).
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.
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();
}
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();
}
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.
Ejemplo
import java.io.Serializable;
public class Persona implements Serializable {private String apellidos;private String nombres;private char sexo;private int edad;
.
.
.}
Muchas gracias por su atención.