Archivos de acceso aleatorio

La clase RandomAccessFile permite abrir un archivo como de lectura, o de lectura y escritura simultáneamente. Si se utiliza para lectura del archivo (modo “r”), dispone de métodos para leer elementos de cualquier tipo primitivo: readInt(). readLong(), readDouble, readLine() y otros. Así mismo, cuando se utiliza el modo de lectura y escritura (modo “rw”) se puede utilizar los métodos de escritura para escribir los tipos de datos de forma similar a como se pueden leer, con los métodos: writeInt(), writeLong(), writeDouble, writeBytes()…

Los métodos que resultan de interés para el acceso aleatorio son los que permiten acceder a un lugar concreto dentro del archivo y conocer el punto del mismo en el que se va a realizar la operación de lectura y/o escritura:

  1. getFilePosition(): Devuelve la posición actual donde se va a realizar la operación de lectura o escritura. Devuelve la posición, contando en bytes donde se encuentra actualmente el cursor del archivo.
  2. seek(): Sitúa la posición de la próxima operación de lectura o escritura en el byte especificado.
  3. length(): Devuelve el tamaño actual del archivo.

En el siguiente ejemplo, se puede ver un programa que se utiliza para ir leyendo carácter a carácter un archivo. Lo que hace es convertir a mayúsculas todos los caracteres ‘i’ que encuentre. Cuando una encuentra una i minúscula vuelve una posición atrás de donde la había leído y escribe el mismo carácter convertido a mayúsculas. El resultado es que el archivo de texto aparece con todas letras i en mayúsculas.

import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class ArchivoAleatorio {

    public static void main(String[] args) throws IOException {

        char c;
        boolean finArchivo = false;
        RandomAccessFile archivo = null;

        try {
            archivo = new RandomAccessFile(“prueba.txt”, “rw”);
            System.out.println(“El tamaño es: ” + archivo.length());
            do {
                try {
                    c = (char) archivo.readByte();
                    if (c == ‘i’) {
                        archivo.seek(archivo.getFilePointer() – 1);
                        archivo.writeByte(Character.toUpperCase(c));
                    }
                } catch (EOFException eof) {
                    finArchivo = true;
                    archivo.close();
                    System.out.println(“Convertidas a mayusculas”);
                }
            } while (!finArchivo);
        } catch (FileNotFoundException fe) {
            System.out.println(“No se encontro el archivo”);

        }

    }

}

Fíjate en la forma de detectar que ha llegado al final del archivo. Los métodos de la clase RandomAccessFile generan una excepción, EOFException, para indicar que se ha intentado ller fuera del archivo. Por eso, para detectar que se ha terminado de leer se utiliza una variable finArchivo, que vale false mientras se siga leyendo el archivo. Cuando se genere la excepción EOFException, se captura, se cierra el archivo y se pone el valor true en la variable finArchivo. Al cambiar este valor, termina el bucle de lectura.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s