Tarea 13: Lectura de Datos Primitivos con DataInputStream
Explicación del Ejercicio
En esta tarea se lee el fichero modulos.dat generado en la tarea anterior con DataInputStream. Como el fichero binario no contiene ninguna información sobre su estructura, los datos deben leerse exactamente en el mismo orden y con los mismos tipos con los que se escribieron.
Conceptos y métodos clave:
-
Validación previa (
exists()): Se comprueba que el fichero existe antes de abrirlo, evitando una excepción si aún no se ha ejecutado la tarea anterior. -
Flujo de datos (
DataInputStream): Envuelve a unFileInputStreamy ofrecereadUTF(),readInt()yreadDouble(), que son los métodos inversos a los de escritura. -
Detección del final (
EOFException): No se sabe cuántos registros hay, así que se lee dentro de un buclewhile (true)que termina cuando salta esta excepción. Al tratarse de la condición normal de fin de fichero, elcatchse deja vacío. - Contador de registros: Se incrementa en cada vuelta del bucle y se muestra al final.
Código Fuente y Salida
Clase12.java
package ClaseFile;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author Eva Gallardo Romero
* @date 28 de sep de 2026
* Leer el fichero "modulos.dat" creado en el ejercicio anterior con
* DataInputStream, mostrando los datos de cada módulo. Los datos se deben
* leer en el mismo orden en el que se escribieron (UTF, int, double).
*/
public class Clase12 {
public static void main(String[] args) {
// objeto File del fichero de datos
File fichero = new File("modulos.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;
try (DataInputStream dis = new DataInputStream(new FileInputStream(fichero))) {
// no sé cuántos registros hay, así que leo hasta que salte EOFException
try {
while (true) {
String nombre = dis.readUTF();
int horas = dis.readInt();
double nota = dis.readDouble();
System.out.println("Módulo: " + nombre + ", horas: " + horas + ", nota: " + nota);
contador++;
}
} catch (EOFException eof) {
// fin del fichero, no hago nada
}
} catch (IOException e) {
System.out.println("Error al leer: " + e.getMessage());
}
System.out.println("Total de módulos leídos: " + contador);
}
}
Resultado Mostrado por Terminal
Salida de Consola
Módulo: Acceso a Datos, horas: 6, nota: 8.5
Módulo: Desarrollo de Interfaces, horas: 6, nota: 7.25
Módulo: Programación de Servicios y Procesos, horas: 3, nota: 9.0
Módulo: Sistemas de Gestión Empresarial, horas: 5, nota: 6.75
Módulo: Programación Multimedia, horas: 5, nota: 8.0
Total de módulos leídos: 5