Tarea 17: Ficheros de Acceso Aleatorio: Escritura con RandomAccessFile

Explicación del Ejercicio

En esta tarea se crea un fichero de acceso aleatorio con registros de tamaño fijo mediante RandomAccessFile. Al ser todos los registros del mismo tamaño, se podrá calcular la posición exacta de cualquiera de ellos sin recorrer el fichero entero.

Conceptos y métodos clave:

  • Modo de apertura (RandomAccessFile): El segundo parámetro "rw" abre el fichero para lectura y escritura.
  • Estructura del registro: Cada registro ocupa 36 bytes: int id (4) + apellido de 10 caracteres (20) + int departamento (4) + double salario (8).
  • Apellido de longitud fija (StringBuffer.setLength(10)): Recorta o rellena el apellido con caracteres nulos hasta los 10 caracteres, y writeChars() lo escribe con 2 bytes por carácter.
  • Identificador: Se calcula como i + 1, la posición del empleado en la lista.
  • Tamaño total (length()): 7 empleados × 36 bytes = 252 bytes.

Código Fuente y Salida

Clase16.java
package ClaseFile;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @author Eva Gallardo Romero
 * @date 29 de sep de 2026
 * Crear el fichero de acceso aleatorio "empleados.dat" con RandomAccessFile.
 * Cada registro ocupa 36 bytes y contiene:
 * - Identificador (int) .............. 4 bytes
 * - Apellido (10 caracteres) ......... 20 bytes
 * - Departamento (int) ............... 4 bytes
 * - Salario (double) ................. 8 bytes
 */
public class Clase16 {

    public static void main(String[] args) {

        // objeto File del fichero aleatorio
        File fichero = new File("empleados.dat");

        // datos de los empleados que voy a guardar
        String[] apellidos = {"MARTIN", "PEREZ", "SANCHEZ", "DIAZ", "ROMERO", "NAVARRO", "IGLESIAS"};
        int[] departamentos = {10, 20, 10, 30, 20, 30, 10};
        double[] salarios = {1250.50, 1800.0, 1500.75, 2100.0, 1950.25, 1400.0, 2300.90};

        // abro el fichero en modo lectura y escritura
        try (RandomAccessFile file = new RandomAccessFile(fichero, "rw")) {

            for (int i = 0; i < apellidos.length; i++) {

                // el identificador es la posición del empleado más uno
                file.writeInt(i + 1);

                // el apellido debe ocupar siempre 10 caracteres
                StringBuffer buffer = new StringBuffer(apellidos[i]);
                buffer.setLength(10);
                file.writeChars(buffer.toString());

                file.writeInt(departamentos[i]);
                file.writeDouble(salarios[i]);

                System.out.println("Registro " + (i + 1) + " escrito: " + apellidos[i]);
            }

            System.out.println("Tamaño del fichero: " + file.length() + " bytes");

        } catch (IOException e) {
            System.out.println("Error de E/S: " + e.getMessage());
        }
    }
}

Resultado Mostrado por Terminal

Salida de Consola
Registro 1 escrito: MARTIN Registro 2 escrito: PEREZ Registro 3 escrito: SANCHEZ Registro 4 escrito: DIAZ Registro 5 escrito: ROMERO Registro 6 escrito: NAVARRO Registro 7 escrito: IGLESIAS Tamaño del fichero: 252 bytes