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
IOException
para 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!