Acceso Aleatorio a Ficheros con RandomAccessFile en Java

El acceso aleatorio a ficheros permite leer y escribir en posiciones específicas dentro de un fichero, sin necesidad de procesarlo de principio a fin. En Java, la clase RandomAccessFile, del paquete java.io, es la herramienta ideal para este propósito. Este artículo explica cómo usar esta clase para manipular ficheros con acceso directo y cómo manejar el puntero de lectura/escritura.


¿Qué es RandomAccessFile?

RandomAccessFile es una clase que permite tanto lectura como escritura en un fichero. A diferencia de otras clases de manejo de ficheros, RandomAccessFile no pertenece a la jerarquía de InputStream o OutputStream. En cambio, combina ambas funcionalidades, lo que la hace ideal para acceder directamente a posiciones específicas del fichero.

Modos de Apertura

Cuando se crea un objeto RandomAccessFile, se debe especificar el modo de acceso al fichero:

  • "r": Solo lectura.
  • "rw": Lectura y escritura. Si el fichero no existe, lo crea.

Cómo Crear un RandomAccessFile

El constructor de RandomAccessFile requiere dos parámetros:

  1. Ruta del fichero.
  2. Modo de apertura ("r" o "rw").

Ejemplo:

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

public class CrearRandomAccessFile {
    public static void main(String[] args) {
        try (RandomAccessFile raf = new RandomAccessFile("datos.bin", "rw")) {
            System.out.println("Fichero creado o abierto con éxito.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Puntero de Lectura/Escritura

El puntero de lectura/escritura es una posición en el fichero desde la cual se leen o escriben datos.

Métodos Principales para Manipular el Puntero

  • long getFilePointer(): Devuelve la posición actual del puntero.
  • void seek(long pos): Mueve el puntero a una posición específica dentro del fichero.
  • long length(): Devuelve el tamaño del fichero en bytes.

Ejemplo:

try (RandomAccessFile raf = new RandomAccessFile("datos.bin", "rw")) {
    System.out.println("Posición inicial: " + raf.getFilePointer());
    raf.seek(10); // Mueve el puntero a la posición 10
    System.out.println("Posición después de seek: " + raf.getFilePointer());
} catch (IOException e) {
    e.printStackTrace();
}

Escritura en Fichero con RandomAccessFile

Puedes escribir datos en cualquier posición del fichero usando métodos como writeInt(), writeDouble(), o writeUTF().

Ejemplo: Escribir Números en Posiciones Específicas

try (RandomAccessFile raf = new RandomAccessFile("datos.bin", "rw")) {
    raf.seek(0); // Escribir en el inicio
    raf.writeInt(123); // Escribe un entero
    raf.seek(4); // Mueve el puntero 4 bytes adelante
    raf.writeDouble(456.78); // Escribe un double
    System.out.println("Datos escritos con éxito.");
} catch (IOException e) {
    e.printStackTrace();
}

Lectura de Ficheros con RandomAccessFile

Para leer datos, puedes usar métodos como readInt(), readDouble(), o readUTF() en la posición actual del puntero.

Ejemplo: Leer Números desde Posiciones Específicas

try (RandomAccessFile raf = new RandomAccessFile("datos.bin", "r")) {
    raf.seek(0); // Mover el puntero al inicio
    int numero = raf.readInt(); // Leer un entero
    raf.seek(4); // Mover el puntero a la posición del double
    double decimal = raf.readDouble(); // Leer un double
    System.out.println("Entero leído: " + numero);
    System.out.println("Double leído: " + decimal);
} catch (IOException e) {
    e.printStackTrace();
}

Uso Práctico: Reemplazar Datos en un Fichero

Con RandomAccessFile, puedes modificar datos en posiciones específicas sin afectar el resto del fichero.

Ejemplo: Reemplazar un Número

try (RandomAccessFile raf = new RandomAccessFile("datos.bin", "rw")) {
    raf.seek(4); // Posición del número a reemplazar
    raf.writeDouble(789.01); // Reemplazar el double
    System.out.println("Número reemplazado con éxito.");
} catch (IOException e) {
    e.printStackTrace();
}

Uso Avanzado: Añadir Datos al Final del Fichero

Puedes añadir datos al final del fichero usando el método length() para mover el puntero a la última posición.

Ejemplo:

try (RandomAccessFile raf = new RandomAccessFile("datos.bin", "rw")) {
    raf.seek(raf.length()); // Mueve el puntero al final
    raf.writeUTF("Texto añadido"); // Escribe texto
    System.out.println("Datos añadidos al final del fichero.");
} catch (IOException e) {
    e.printStackTrace();
}

Consideraciones al Usar RandomAccessFile

  1. Sincronización: No está sincronizado, por lo que no es adecuado para entornos multihilo sin control adicional.
  2. Tamaño del Registro: Al trabajar con estructuras de datos fijas, asegúrate de que cada registro tenga un tamaño uniforme para facilitar el acceso.
  3. Excepciones: Maneja IOException para errores de entrada/salida y asegúrate de cerrar el fichero tras su uso (puedes usar try-with-resources).

Conclusión

RandomAccessFile es una herramienta poderosa para el manejo de ficheros cuando necesitas acceder directamente a posiciones específicas para leer o escribir datos. Dominar esta clase te permitirá trabajar de manera eficiente con datos complejos y ficheros grandes. Con los ejemplos y métodos descritos aquí, estarás listo para implementar acceso aleatorio en tus proyectos. ¡Manos a la obra!

gray and black laptop computer
Photo by Pixabay on Pexels.com

Deja un comentario

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

error: Content is protected !!

Descubre más desde Tomás González: Formador y Desarrollador Web

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad