Serialización y Deserialización de Objetos en Java con ObjectOutputStream y ObjectInputStream
Serialización y Deserialización de Objetos en Java
El siguiente código implementa el almacenamiento persistente y la recuperación secuencial de objetos en Java mediante los flujos ObjectOutputStream y ObjectInputStream, haciendo uso de la interfaz java.io.Serializable.
Estructura del Programa: Clase FicheroUTFApp
El programa se divide en dos fases principales:
- Escritura de objetos: se instancian elementos de la clase interna amigo y se registran secuencialmente en el archivo binario
amigos.txt. - Lectura de objetos: se recupera cada objeto mediante un bucle infinito que procesa registros hasta capturar la excepción estándar
EOFException(fin del fichero).
Código Fuente Completo
package ficheroutfapp;
import java.io.*;
public class FicheroUTFApp {
public static class amigo implements java.io.Serializable {
protected String nombre;
protected long telefono;
public amigo(String n, long t) {
nombre = n;
telefono = t;
}
public void print() {
System.out.println(nombre + " -> " + telefono);
}
}
public static void main(String[] args) {
String[] amigos = {"Andrés Rosique", "Pedro Ruiz", "Isaac Sánchez", "Juan Serrano"};
long[] telefonos = {653364787L, 627463746L, 644567346L, 623746348L};
// Escritura del fichero
try {
FileOutputStream fs = new FileOutputStream("amigos.txt");
ObjectOutputStream oos = new ObjectOutputStream(fs);
for (int i = 0; i < 4; i++) {
amigo a = new amigo(amigos[i], telefonos[i]);
oos.writeObject(a);
}
if (oos != null) {
oos.close();
fs.close();
}
} catch (IOException e) {
e.printStackTrace();
}
// Lectura del fichero
try {
File f = null;
FileInputStream fe = null;
ObjectInputStream ois = null;
try {
f = new File("amigos.txt");
if (f.exists()) {
fe = new FileInputStream(f);
ois = new ObjectInputStream(fe);
while (true) {
amigo a = null;
a = (amigo) ois.readObject();
a.print();
System.out.println("");
}
}
} catch (EOFException eof) {
System.out.println("------------------");
} catch (FileNotFoundException fnf) {
System.err.println("Fichero no encontrado: " + fnf);
} catch (IOException e) {
System.err.println("Se ha producido una IOException");
e.printStackTrace();
} catch (Throwable e) {
System.err.println("Error de programa: " + e);
e.printStackTrace();
} finally {
if (ois != null) {
ois.close();
fe.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}Puntos Clave del Manejo de Excepciones
EOFException: señala de manera natural la finalización de los datos disponibles en el flujo binario sin incurrir en lecturas nulas erróneas.- Cierre seguro en bloque
finally: garantiza la liberación adecuada de los descriptores de archivo asociados aFileInputStreamyObjectInputStream.