Tarea 18: Ficheros de Acceso Aleatorio: Lectura con seek()
Explicación del Ejercicio
En esta tarea se lee el fichero empleados.dat creado en la tarea anterior colocando el puntero del fichero al principio de cada registro. Requiere haber ejecutado antes la Tarea 17.
Conceptos y métodos clave:
-
Modo solo lectura (
"r"): Se abre elRandomAccessFilesin permiso de escritura, ya que solo se va a consultar. -
Posicionamiento (
seek()): Un bucleforavanzaposicionde 36 en 36 bytes hastafile.length(), yseek()coloca el puntero al inicio de cada registro. -
Lectura de tipos (
readInt(),readChar(),readDouble()): Se leen en el mismo orden en el que se escribieron: id, los 10 caracteres del apellido, departamento y salario. -
Limpieza del apellido (
new String(apellido).trim()): Convierte el array de caracteres en texto y elimina los caracteres nulos de relleno. -
Registros vacíos: Solo se muestran los registros con
id > 0, ya que un hueco del fichero tiene todos sus bytes a 0.
Código Fuente y Salida
Clase17.java
package ClaseFile;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* @author Eva Gallardo Romero
* @date 30 de sep de 2026
* Leer secuencialmente el fichero "empleados.dat" con RandomAccessFile
* moviéndome de registro en registro con seek(). Cada registro ocupa
* 36 bytes. Solo se muestran los registros con identificador mayor que 0.
*/
public class Clase17 {
public static void main(String[] args) {
// objeto File del fichero aleatorio
File fichero = new File("empleados.dat");
// compruebo que el fichero existe antes de leerlo
if (!fichero.exists()) {
System.out.println("El fichero no existe: " + fichero.getName());
return;
}
// abro el fichero solo en modo lectura
try (RandomAccessFile file = new RandomAccessFile(fichero, "r")) {
char[] apellido = new char[10];
// avanzo de 36 en 36 bytes hasta llegar al final del fichero
for (long posicion = 0; posicion < file.length(); posicion = posicion + 36) {
// me coloco al principio del registro
file.seek(posicion);
int id = file.readInt();
// leo los 10 caracteres del apellido uno a uno
for (int i = 0; i < apellido.length; i++) {
apellido[i] = file.readChar();
}
int dep = file.readInt();
double salario = file.readDouble();
// los registros vacíos tienen id 0, así que no los muestro
if (id > 0) {
System.out.printf("ID: %d, Apellido: %s, Departamento: %d, Salario: %.2f %n",
id, new String(apellido).trim(), dep, salario);
}
}
} catch (IOException e) {
System.out.println("Error de E/S: " + e.getMessage());
}
}
}
Resultado Mostrado por Terminal
Salida de Consola
ID: 1, Apellido: MARTIN, Departamento: 10, Salario: 1250.50
ID: 2, Apellido: PEREZ, Departamento: 20, Salario: 1800.00
ID: 3, Apellido: SANCHEZ, Departamento: 10, Salario: 1500.75
ID: 4, Apellido: DIAZ, Departamento: 30, Salario: 2100.00
ID: 5, Apellido: ROMERO, Departamento: 20, Salario: 1950.25
ID: 6, Apellido: NAVARRO, Departamento: 30, Salario: 1400.00
ID: 7, Apellido: IGLESIAS, Departamento: 10, Salario: 2300.90