Está en la página 1de 5

Persistencia

Concepto
Los datos mantenidos como archivos se denominan persistentes.

Jerarquía de datos
Así como los caracteres se componen de bits, los campos se componen de caracteres. Un
campo es un grupo de caracteres que comunican algo (un nombre por ejemplo).
Los elementos de información procesados forman una jerarquía en la que los elementos se
hacen cada vez más grandes y con una estructura más compleja (bits, bytes, campos, etc.)

Registro
Un registro se compone de varios campos (atributos de Java) por ejemplo:
1. Número ID
2. Nombre
3. Dirección
4. Sueldo/hora

Para facilitar la recuperación de un registro, se escoge (al menos) un campo de cada


registro para usar de clave al momento de identificarlo.

Forma de organizar un registro


Secuencial: La más común, se ordena según la clave, la cual aumenta junto a la cantidad
de registros.

Archivos y flujos (stream)

Archivo
Un archivo es un grupo de registros relacionados entre sí. Puede tener muchos registros y
todos deben tener el mismo formato. A un grupo de archivos relacionados entre sí, se lo
denomina base de datos

Stream
Un stream es un conducto por el cual fluye información de manera secuencial entre el
programa y una fuente externa.

Fuentes de información: Archivo, disco, red, memoria, otros programas, etc.


Información utilizada: Objetos, caracteres, imágenes, sonidos, etc.
Para enviar información, un programa abre un stream de salida al destino externo.
Análogamente, para recibir información, el programa abre un stream de entrada.

Algoritmo
open a stream
while more information
read/write information
close the stream

Java considera los archivos como flujos secuenciales de bytes.


Cuando se abre un archivo, se crea un objeto y se asocia un stream a dicho objeto.
(Requiere importar java.io)
Cuando ejecutamos una aplicación o applet de java, se crean automáticamente tres objetos
de stream:
● System.in: Permite a un programa introducir bytes desde el teclado.
● System.out: Permite a un programa enviar datos a la pantalla.
● System.err: Permite a un programa enviar mensajes de error a la pantalla.

Clases de flujo java.io


Este paquete incluye clases de flujo como FileInputStream y FileOutputStream. Que son
flujos de entrada y salida respectivamente, de archivos.
Los archivos se abren creando objetos de estas clases de flujo, que derivan de
InputStream y OutputStream.
Para operaciones de entrada y salida de datos primitivos, se utiliza objetos de la clase
DataInputStream y DataOutputStream.

InputStream and OutputStream


● Son clases abstractas que definen métodos para operaciones de entrada y salida.
● La entrada y salida se efectúa con las sub clases FileInputStream y
FileOutputStream.
● Utilizamos PrintStream para enviar salidas a la pantalla.
● Un FilterInputStream filtra un InputStream, implica que el flujo tiene una
funcionalidad adicional (almacenar datos temporales, contadores de líneas, etc.).
● Las clases DataInputStream y RandomAccessFile implementan la interfaz
DataInput.
● Los DataInputStream permiten leer datos binarios de un InputStream.

Archivos de acceso aleatorio


El acceso aleatorio proporciona acceso instantáneo a la información que necesitamos.
Se utilizan técnicas para organizar la estructura de los archivos de acceso aleatorio, la más
sencilla es exigir que todos los registros tengan una longitud fija, permitiendo así
calcular con facilidad la posición de cada registro.
Tamaños de datos en bytes

Tipo de dato Tamaño

int 4

double 8

float 4

long 8

char 2

String 2+char

boolean 1

Creación de archivos de acceso aleatorio - RandomAccessFile


Los objetos RandomAccessFile tienen todas las capacidades de los objetos
DataInputStream y DataOutputStream.
Al asociar un flujo a un archivo, los datos se leen o escriben a partir del apuntador y en
forma de datos primitivos (binarios).
● El constructor de RandomAccessFile tiene dos parámetros:
○ El nombre del archivo a leer/escribir.
○ El modo en que se comporta el stream (r para solo lectura, rw para
lectura/escritura)
● Una excepción finaliza el programa.
● Si el archivo no existe, se crea (y puntero en byte 0).
● Al iniciar el stream, el puntero siempre se posiciona en el byte 0.

Agregar Registro
Los métodos de RandomAccessFile que permiten agregar registros son:
● length() proporciona la cantidad de bytes que tiene el archivo y
● seek(n) mueve el puntero al byte n.
● write envía a la salida el registro de información del objeto RandomAccessFile que
se le pase como parámetro.
○ Ejemplo: archivo.writeInt(número);
○ Hay que tener cuidado con los strings ya que su dimensión es variable.
Buscar registro
Implica el movimiento del puntero, registro por registro, comparando un valor determinado
con el de alguno de los campos almacenados (clave).

● Devuelve el byte de comienzo del registro (Si lo encuentra)


● El algoritmo debe considerar el final del archivo
● Si el tamaño del archivo es 0, no se realiza la búsqueda (pero devuelve -1)

Consultar registro
Para consultar un registro, se debe conocer su ubicación (byte donde comienza).
● Se puede imprimir los resultados o devolver un objeto con los elementos del registro.

Modificar registro
Para modificar un registro debemos saber dónde está, posicionarnos al comienzo de este y
sobreescribirlo con un registro del mismo tamaño.

Cerrar el archivo
Antes de finalizar se debe cerrar el archivo para que las modificaciones realizadas en el
programa sean guardadas.

A tener en cuenta:
Leer y escribir string = writeUTF(palabra), readUTF
Para guardar Objetos

Mapeo
Pasar de un formato a otro, puede ser automático o manual.

Objeto <-> Archivo: Manual porque el programador respeta el orden en que se configura el
archivo o el orden para crear el objeto por parámetros.
Atributo <-> Campo: Automática porque lo hace java con métodos específicos
(atributo=objeto -> campo)
Persistencia de objetos
● Se guarda objeto solo en 1 campo, se recupera de la misma forma, automatico.
● Mapeo de objeto a objeto.
● Se utiliza las clases ObjectOutputStream y ObjectInputStream
● Los objetos a guardar deben implementar la clase serializable
○ También los objetos dentro del objeto, sino se guarda null
● Al recuperar los objetos, vuelven como Object, se debe castear.

¿Hay diferencia de mapeo? Si, el mapeo del RandomAccessFile es Manual, ya que para
guardar objetos se debe guardar cada atributo en orden. Mientras que en ObjectInput es
automático, ya que se utiliza un método concreto de java para subirlo completo.

También podría gustarte