jueves, 14 de abril de 2016

Leer y escribir objetos en ficheros - Java



La lectura y escritura de objetos en un fichero binario requiere el uso de las clases FileOutpusStream y ObjectOutputStream. La clase ObjectOutputStream permite escribir objetos en un fichero utilizando el método writeObject(Object o). Los datos que se almacenan en el fichero de salida tienen un formato binario distinto de los ficheros de texto.
El método close() de la clase ObjectOutputStream cierra el fichero de datos.

Para escribir objetos utilizando la clase ObjectOutputStream es necesario codificar los objetos dentro del flujo de salida. A la codificación de los objetos dentro de un flujo de entrada o salida se le denomina “serialización”. Para que los objetos de una clase sean “serializables” es necesario implementar la interfaz Serializable de Java.

Para leer objetos almacenados en un fichero binario se utiliza el método readObject() de la clase ObjectInputStream. Después de leer el objeto del fichero se debe convertir a la clase a la que pertenece. 
Cuando se utilizan los flujos ObjectInputStream y ObjectOutputStream de Java es necesario atrapar los errores de ejecución que se producen mientras se lee o escribe el fichero de datos con los flujos de entrada y salida. Para atrapar los errores de ejecución o excepciones, se utilizan las sentencias try y catch. Las excepciones que se producen durante la ejecución de las sentencias definidas en el cuerpo del try se atrapan con catch.

Para escribir un objeto de la clase Persona en un fichero binario, es necesario indicar que esta clase es “serializable”, es decir, que sus objetos se codifican dentro de los flujos de entrada y salida de Java. Para indicar que la clase Persona es “serializable” se modifica su declaración indicando que implementa la interfaz Serializable.

public class Persona implements java.io.Serializable {
}

La declaración completa de la clase Persona, con la implementación de la interfaz Serializable, su método constructor y sus métodos ‘get’ y ‘set’.

public class Persona implements java.io.Serializable {
private String dni;
private String nombre;
private String apellidos;
public Persona(String dni, String nombre, String apellidos) {
this.dni = dni;
this.nombre = nombre;
this.apellidos = apellidos;
}
public String getDNI() {
return this.dni;
}
public String getNombre() {
return this.nombre;
}
public String getApellidos() {
return this.apellidos;
}
public String getAtributos() {
return this.getDNI() + " " + this.getApellidos() + ", " +
this.getNombre();
}
}

Para escribir un objeto de la clase Persona en un fichero de texto se utilizan las clases FileOutputStream y ObjectOutputStream. Se crea una instancia de la clase FileOutputStream para inicializar la instancia objetoSalida de ObjectOutputStream que escribe en el fichero binario Objetos.dat.

String nombreFichero = "c:\\Objetos.dat";
try {
FileOutputStream ficheroSalida = new
FileOutputStream(nombreFichero);
ObjectOutputStream objetoSalida = new
ObjectOutputStream(ficheroSalida);
// se escriben dos objetos de la clase Persona
objetoSalida.writeObject(new Persona("55287188B",
"María", "Ruiz Ramos"));
objetoSalida.writeObject(new Persona("40302010A",
"Juan", "González López"));
objetoSalida.close();
} catch (FileNotFoundException e) {
System.out.println("¡El fichero no existe!");
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
};

Para leer los objetos almacenados en el fichero binario se utilizan las clases FileInputStream y ObjectInputStream. Se crea una instancia de la clase FileInputStream para inicializar la instancia objetoEntrada de ObjectInputStream.

try {
FileInputStream ficheroEntrada = new
FileInputStream(nombreFichero);
ObjectInputStream objetoEntrada = new
ObjectInputStream(ficheroEntrada);
// se leen dos objetos de la clase Persona
Persona p1 = (Persona)objetoEntrada.readObject();
Persona p2 = (Persona)objetoEntrada.readObject();
// se cierra el flujo de objetos objetoEntrada
objetoEntrada.close();
System.out.println("DNI\t Nombre");
System.out.println(p1.getAtributos());
System.out.println(p2.getAtributos());
} catch (FileNotFoundException e) {
System.out.println("¡El fichero no existe!");
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
};

La salida por la consola:
DNI Nombre
55287188B Ruiz Ramos, María
40302010A González López, Juan

Las sentencias try y catch se utilizan para atrapar las excepciones que se producen durante la ejecución del programa: FileNotFoundException, IOException o Exception. De esta forma se atrapan los errores que se producen cuando el fichero de datos no existe o cuando hay un problema de lectura o escritura en el fichero.
Las excepciones son el mecanismo que proporciona Java para gestionar los errores de ejecución de una aplicación. 
La sentencia try-catch-finally tiene la siguiente sintaxis:

try {
sentencias-que-pueden-producir-una-excepción;
} catch (Excepción-tipo-1 e) {
sentencias-para-excepción-tipo-1;
} catch (Excepción-tipo-2 e) {
sentencias-para-excepción-tipo-2;
} catch (Excepción-tipo-3 e){
sentencias-para-excepción-tipo-3;
} finally {
sentencias-que-se-ejecutan-si-hay-excepción-o-no;
};

En una sentencia try-catch-finally, los bloques catch se pueden repetir tantas veces como excepciones de distinto tipo se desee atrapar. El bloque finally es opcional y solo puede aparecer una vez. Este bloque se ejecuta siempre.

El programa Java que escribe y lee objetos.



Espero haber ayudado en algo. Hasta la próxima oportunidad!











  

2 comentarios:

  1. Respuestas
    1. Hola Andres Mauricio Ospina Navarrete, gracias por la visita y el aporte de tu comentario!!
      Los mejores deseos! Hasta cualquier momento!!

      Eliminar