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 un FileInputStream y reconstruye los objetos guardados en el fichero.
  • Lectura y casting (readObject()): Devuelve un Object, por lo que hay que hacer un casting explícito a Alumno.
  • Fin de fichero (EOFException): Se lee en un bucle infinito que se rompe al saltar esta excepción, donde se muestra el mensaje FIN DE LECTURA.
  • Multicaptura (IOException | ClassNotFoundException): readObject() puede lanzar ClassNotFoundException si no encuentra la clase del objeto, y se trata en el mismo catch que IOException.
  • 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