La clase RandomAccessFile permite el acceso directo a cualquier posición de un fichero de texto. Esta clase permite abrir los ficheros de texto en modo lectura ("r") o en modo lectura y escritura ("rw"), especificándolo en el segundo parámetro del método constructor.

El lugar del fichero al que se accede para leer o escribir está marcado por un puntero que señala al carácter a partir del cual se hará la operación de lectura o escritura. Cada vez que se hace una lectura o escritura, el puntero se posiciona automáticamente en el siguiente carácter.

La clase RandomAccessFile dispone de varios métodos para permitir las operaciones sobre los ficheros:

  • public void seek(long pos)
    • Posiciona el puntero en la posición 'pos'. El primer carácter se encuentra en la posición 0.
  • public long getFilePointer()
    • Retorna la posición actual del puntero.
  • public long length()
    • Retorna la longitud del fichero
  • public int read()
    • Retorna el byte leído en la posición marcada por el puntero. Se dfebe utilizar este método para leer los caracteres de un fichero de texto, no el método readChar que se comenta después.
  • public final String readLine()
    • Retorna la cadena de caracteres que se lee, desde la posición marcada por el puntero, hasta el siguiente salto de línea que se encuentre.
  • Hay un método read para cada tipo de dato básico: readChar, readInt, readDouble, readBoolean, etc.
  • public void write(int b)
    • Escribe en el fichero el byte indicado por parámetro. Se debe utilizar este método para escribir caracteres en un fichero de texto.
  • public final void writeBytes(String s)
    • Escribe en el fichero la cadena de caracteres indicada por parámetro. No incluye salto de línea, por lo que hay que incluirlo en la cadena de caracteres si se desea añadir: writeBytes(cadena+"\n").
  • También existe un método write para cada tipo de dato básico: writeCharwriteInt, writeDoublewriteBoolean, etc.

Ejemplo en el que se accede directamente a una posición del fichero de texto y se convierte a mayúsculas el carácter leído en esa posición.

        //La variable 'pos' indicará la posición del puntero del fichero,
// señalando el lugar donde se leerá o escribirá
int pos = 11;
String nombreFichero = "prueba.txt";
RandomAccessFile raf = null;
try
{
//Se abre el fichero para permitir lectura y escritura
raf = new RandomAccessFile(nombreFichero,"rw");
//Obtener el tamaño del fichero
long tamaño = raf.length();
//Posicionar el puntero del fichero en la posición indicada
raf.seek(pos);
//Comprobar si se intenta posicionar el puntero mas allá
// del tamaño del fichero
if(raf.getFilePointer()<tamaño)
{
//Leer un carácter y avanzar puntero al siguiente carácter
//Los caracteres leídos se toman de tipo entero
int caract = raf.read();
//Retroceder una posición para volver a la posición anterior
raf.seek(raf.getFilePointer()-1);
//Escribir el carácter leído convertido a mayúsculas
raf.write(Character.toUpperCase(caract));
}
}
catch (FileNotFoundException e) {
System.out.println("Error: Fichero no encontrado");
System.out.println(e.getMessage());
}
catch(Exception e)
{
System.out.println("Error de lectura/escritura en el fichero");
System.out.println(e.getMessage());
}
finally {
try {
if(raf != null)
raf.close();
}
catch (Exception e) {
System.out.println("Error al cerrar el fichero");
System.out.println(e.getMessage());
}
}
        //La variable 'pos' indicará la posición del puntero del fichero,
        //  señalando el lugar donde se leerá o escribirá
        int pos = 11;
        String nombreFichero = "prueba.txt";
        RandomAccessFile raf = null;
        try
        {
            //Se abre el fichero para permitir lectura y escritura
            raf = new RandomAccessFile(nombreFichero,"rw");
            //Obtener el tamaño del fichero
            long tamaño = raf.length();
            //Posicionar el puntero del fichero en la posición indicada
            raf.seek(pos);
            //Comprobar si se intenta posicionar el puntero mas allá
            //  del tamaño del fichero
            if(raf.getFilePointer()<tamaño)
            {
                //Leer un carácter y avanzar puntero al siguiente carácter
                //Los caracteres leídos se toman de tipo entero
                int caract = raf.read();
                //Retroceder una posición para volver a la posición anterior
                raf.seek(raf.getFilePointer()-1);
                //Escribir el carácter leído convertido a mayúsculas
                raf.write(Character.toUpperCase(caract));
            }
            //Cerrar el fichero
            raf.close();
        }
        catch (FileNotFoundException e) {
            System.out.println("Error: Fichero no encontrado");
            System.out.println(e.toString());
        }
        catch(Exception e)
        {
            System.out.println("Error de lectura/escritura en el fichero");
            System.out.println(e.toString());
        }
        finally {
            try {
                if(raf != null)
                    raf.close();
            }
            catch (Exception e) {
                System.out.println("Error al cerrar el fichero");
                System.out.println(e.toString());
            }
        }