18 nov 2015

Acceso aleatorio a ficheros en Java

Java dispone de la clase RandomAccessFile que permite acceder al contenido de un fichero binario de forma aleatoria.

Para crear objetos de esta clase, al constructor se le puede pasar, o la ruta mediante un String o mediante un File. En cualquiera de los dos casos hay que pasar un segundo parámetro con el modo de acceso. El modo de acceso puede ser “r”, “rw”

Ejemplos:
Fich= new RandomAccessFile(String nombre, String modoAcceso)
Fich = new RandomAccessFile(File fic, String modoAcceso)


Los métodos más importantes son:
long getFilePointer()
Devuelve la posición del puntero en el fichero.
void seek(long pos)
Pone el puntero en la posición dada por pos, tomada desde el inicio.
long length()
Devuelve el tamaño del fichero en bytes.
Int skipBytes (int desplaz)
Mueve el puntero desde su posición el número de bytes indicado por desplaz.

Ejemplo:
Vamos a guardar los datos de una serie de empleados. Interesa que los datos de cada persona tengan la misma longitud para poder saltar e ir a una persona, para ello limitamos (fijamos) el tamaño de los String antes de escribirlos:

buffer = new StringBuffer(apellidos[i]);
buffer.setLength(10);

El resto de campos tienen una longitud fija, porque son enteros y double.
En total: int (4 bytes), string (20 bytes), int (4 bytes) y double (8 bytes) = 36 bytes.
Tamaño del fichero= 8 registros x 36 bytes = 288 bytes

public class EscribirFichAleatorio {
public static void main(String[] args) throws IOException {
        // TODO code application logic here
        File fich = new File("Empl_aleat.dat");
        RandomAccessFile file = new RandomAccessFile(fich, "rw");
        String[] apellidos = {"MARTÍN", "SORIA", "FERNÁNDEZ", "LUNA", "GARCÍA", "PÉREZ", "RODRÍGUEZ", "MARTÍNEZ"};
        int[] dept = {10, 20, 30, 20, 10, 40, 30, 40};
        Double[] salario = {850.65, 12035.36, 2156.36, 1500.32, 989.23, 1566.32, 1866.88, 2356.78};
        StringBuffer buffer = null;
        for (int i = 0; i < apellidos.length; i++) {
            file.writeInt(i + 1); //identificador de empleado
            buffer = new StringBuffer(apellidos[i]);
            buffer.setLength(10);
            file.writeChars(buffer.toString());
            file.writeInt(dept[i]);
            file.writeDouble(salario[i]);
        }
        file.close();
    }
}


No hay comentarios:

Publicar un comentario