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:
- Ruta del fichero.
- 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
- Sincronización: No está sincronizado, por lo que no es adecuado para entornos multihilo sin control adicional.
- 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.
- Excepciones: Maneja
IOExceptionpara errores de entrada/salida y asegúrate de cerrar el fichero tras su uso (puedes usartry-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!

