A menudo, no necesitas leer un fichero de principio a fin, sino simplemente acceder al fichero como si fuera una base de datos, donde se salta de un registro a otro; cada uno en diferentes partes del fichero. Java proporciona una clase RandomAccessFile
para este tipo de entrada/salida.
Esta clase:
- Permite leer y escribir sobre el fichero, no es necesario dos clases diferentes.
- Necesita que le especifiquemos el modo de acceso al construir un objeto de esta clase: sólo lectura o bien lectura y escritura.
- Posee métodos específicos de desplazamiento como
seek(long posicion)
oskipBytes(int desplazamiento)
para poder movernos de un registro a otro del fichero, o posicionarnos directamente en una posición concreta del fichero.
Por esas características que presenta la clase, un archivo de acceso directo tiene sus registros de un tamaño fijo o predeterminado de antemano.
La clase posee dos constructores:
RandomAccessFile(File file, String mode).
RandomAccessFile(String name, String mode).
En el primer caso se pasa un objeto File
como primer parámetro, mientras que en el segundo caso es un String. El modo es: "r" si se abre en modo lectura o "rw" si se abre en modo lectura y escritura.
A continuación puedes ver una presentación en la que se muestra cómo abrir y escribir en un fichero de acceso aleatorio. También, en el segundo código descargable, se presenta el código correspondiente a la escritura y localización de registros en ficheros de acceso aleatorio.
Ejemplo:
Vamos a ver un pequeño ejemplo, Log.java
, que añade una cadena a un fichero existente, lo crea en caso de que no exista.
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomEjemplo {
public static void main( String args[] ) throws IOException {
RandomAccessFile miRAFile;
String s = "linea a añadir al final del fichero";
// Abrimos el fichero de acceso aleatorio
miRAFile = new RandomAccessFile( "java.log","rw" );
// Nos vamos al final del fichero
miRAFile.seek( miRAFile.length() );
// Incorporamos la cadena al fichero
miRAFile.writeBytes( s );
// Cerramos el fichero
miRAFile.close();
}
}