De manera muy sencilla, es posible escribir información de un objeto Java en un archivo para evitar perder la información luego de que se cierre el programa Java, es decir tener persistencia en Java. Es muy básicamente una forma de evitar solo trabajar en tiempo de ejecución y ampliar el alcance de nuestro programa cada vez que se vuelva a iniciar el programa. Existen maneras de escribir sobre un archivo de tal manera que la información se escriba en forma de caracteres. Es decir los atributos de cada objeto pueden estar almacenados en un archivo en forma de caracteres. Supongamos que tenemos una clase Paciente con los atributos: nombre(String), no. documento(String) y género(char). Entonces es posible enviar como caracteres, la información de cada campo hacia un archivo pudiendo obtener un archivo así:
Este método funciona como un registro de datos, pero al momento de querer obtener este registro y almacenarlo como un objeto necesitamos obtener cada campo de cada línea, hacer casting para cada valor (porque hay que recordar que los vamos a obtener como caracteres) y luego setearlos de nuevo en el objeto. Este ejemplo puede no presentar muchos problemas, pero que sucede si tenemos muchos atributos, eso implicaría líneas de código y redundancia. Más bien este método mostrado, sirve para enviar datos listos para su impresión.
La serialización de Objetos, permite enviar datos en forma de bytes, de tal manera que cada archivo contendrá toda la información del objeto, es decir incluye que librerias ha importado, paquetes, herencia, etc. Pero principalmente contiene el tipo de datos de cada atributo lo que simplificaría mucho las cosas. Es decir, el mecanismo de serialización realiza copias exactas de los objetos.
Para el envío de objetos nos apoyamos en las clases ObjectInputStream y ObjectOutputStream, permirten leer y enviar objetos respectivamente. El constructor de estas dos clases espera recibir como argumento de entrada un objeto flujo(Output/InputStream) que pueden escribir o enviar información.
Este mecanismo sirve como envoltura, por ejemplo para archivos: para envolver un objeto FileInputStream en un objeto ObjectInputStream, se pasa el objeto FileInputStream al constructor de ObjectInputStream, así:
ObjectInputStream entrada = ObjectInputStream(new (FileInputStream archivo)) ;
donde archivo es de tipo File.
O para el constructor de ObjectOutputStream:
ObjectOutputStream entrada = ObjectOutputStream(new (FileOutputStream archivo)) ; donde archivo es de tipo File.
A continuación se muestra un ejemplo:
Se tiene la clase paciente con 4 atributos:
El archivo de texto no mostrará nada debido a que lo que se envía es bytes y para ver esa información se necesitará un editor diferente. Pero una buena forma de comprobar de que si se está enviando información, es chequeando el tamaño del archivo, que se modificará luego de enviar información.
Una vez que la información está almacenada en el archivo se la leerá y luego se la almacenará en un nuevo ArrayList de Pacientes. Para realizar esta opción necesitaremos de un objeto del tipo ObjectInputStream:
Como es de notarse, el envío de datos mediante flujo de caracteres se complica aquí por la presencia del atributo Calendar fechaNacimiento, además de lo nombrado al inicio de este post.
Para poder serializar primeramente la clase debe implementar la interface Serializable, que no requiere implementar ningún método. Además si queremos que uno de los atributos no se serialize, entonces añadimos la palabra transient.
En la clase principal:
Una vez que la información está almacenada en el archivo se la leerá y luego se la almacenará en un nuevo ArrayList de Pacientes. Para realizar esta opción necesitaremos de un objeto del tipo ObjectInputStream:





No hay comentarios:
Publicar un comentario