Tarea 15: Lectura de Objetos con ObjectInputStream
Explicación del Ejercicio
En esta tarea se leen los objetos Alumno guardados en alumnos.dat por la tarea anterior, se muestran sus datos y se calcula la nota media. Requiere la clase Alumno de la Tarea 14 en el mismo paquete.
Conceptos y métodos clave:
-
Flujo de objetos (
ObjectInputStream): Envuelve a unFileInputStreamy reconstruye los objetos guardados en el fichero. -
Lectura y casting (
readObject()): Devuelve unObject, por lo que hay que hacer un casting explícito aAlumno. -
Fin de fichero (
EOFException): Se lee en un bucle infinito que se rompe al saltar esta excepción, donde se muestra el mensajeFIN DE LECTURA. -
Multicaptura (
IOException | ClassNotFoundException):readObject()puede lanzarClassNotFoundExceptionsi no encuentra la clase del objeto, y se trata en el mismocatchqueIOException. - Nota media: Se acumulan las notas en una variable y se divide entre el número de alumnos leídos, comprobando antes que el contador sea mayor que 0.
Código Fuente y Salida
Clase14.java
package ClaseFile;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
* @author Eva Gallardo Romero
* @date 29 de sep de 2026
* Leer los objetos Alumno guardados en el fichero "alumnos.dat" con
* ObjectInputStream. Se muestran los datos de cada alumno y al final
* el número de alumnos leídos y la nota media.
*/
public class Clase14 {
public static void main(String[] args) {
// objeto File del fichero de objetos
File fichero = new File("alumnos.dat");
// compruebo que el fichero existe antes de leerlo
if (!fichero.exists()) {
System.out.println("El fichero no existe: " + fichero.getName());
return;
}
int contador = 0;
double suma = 0;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fichero))) {
// leo objetos hasta que salte EOFException (fin del fichero)
try {
while (true) {
// readObject devuelve Object, por eso hago el casting a Alumno
Alumno alumno = (Alumno) ois.readObject();
System.out.printf("Nombre: %s, edad: %d, nota: %.2f %n",
alumno.getNombre(), alumno.getEdad(), alumno.getNota());
contador++;
suma += alumno.getNota();
}
} catch (EOFException eof) {
System.out.println("FIN DE LECTURA");
}
} catch (IOException | ClassNotFoundException e) {
System.out.println("Error al leer los objetos: " + e.getMessage());
}
if (contador > 0) {
System.out.printf("Alumnos leídos: %d, nota media: %.2f %n", contador, suma / contador);
}
}
}
Resultado Mostrado por Terminal
Salida de Consola
Nombre: Lucía, edad: 20, nota: 8.50
Nombre: Carlos, edad: 22, nota: 6.00
Nombre: Marta, edad: 21, nota: 9.25
Nombre: Javier, edad: 23, nota: 7.50
Nombre: Elena, edad: 20, nota: 5.75
FIN DE LECTURA
Alumnos leídos: 5, nota media: 7.40