Está en la página 1de 14

Acceso al disco Parte 2

Tecnologa de la Programacin I Ing. Zoraida Vidal Melgarejo, Mg.


1

Archivos de acceso aleatorio


El tipo de acceso aleatorio permite escribir o leer datos de una ubicacin concreta dentro del archivo. El paquete java.io contiene la clase RandomAccessFile que proporciona las capacidades que permiten este tipo de acceso directo. Un flujo de esta clase permite realizar tanto operaciones de lectura y escritura sobre el archivo vinculado al mismo. En un archivo accedido aleatoriamente, para acceder a un registro en particular, se utiliza un puntero de lectura o escritura (L/E). Dicho puntero es situado automticamente al principio del archivo cuando ste se abre para leer y/o escribir.
2

La clase RandomAccessFile
Un flujo de esta clase permite acceder directamente a cualquier posicin dentro del archivo vinculado con l. La clase RandomAccessFile proporciona dos constructores:
RamdomAccessFile(String archivo, String modo) RandomAccessFile(File archivo, String modo)

El argumento modo puede ser:


r rw : read. Slo se permite realizar operaciones de lectura. : read/write. Se pueden realizar operaciones de lectura y de escritura sobre el archivo.
3

Mtodos de desplazamiento
long getFilePointer(): Devuelve la posicin actual del puntero del archivo. void seek(long des): Coloca el puntero del archivo en la posicin indicada por des. Un archivo siempre empieza en la posicin 0. int skipBytes(int n): Intenta saltar n bytes desde la posicin actual. long length(): Devuelve la longitud del archivo. void setLength(long tam): Establece a tam el tamao del archivo. FileDescriptor getFD(): Devuelve el descriptor del archivo.

Archivos de Acceso Aleatorio


import java.io.*; import static javax.swing.JOptionPane.showMessageDialog; import entidades.Alumno;

public class FileAlumno { private RandomAccessFile flujo; private int numeroRegistros; private int tamaoRegistro = 180;

Archivos de Acceso Aleatorio


public FileAlumno(File archivo) throws IOException { if(archivo.exists() && !archivo.isFile()) throw new IOException(archivo.getName() + " no es un archivo"); flujo = new RandomAccessFile(archivo, "rw"); numeroRegistros = (int)Math.ceil((double)flujo.length() / (double)tamaoRegistro); }
6

Archivos de Acceso Aleatorio


public void cerrar() throws IOException { flujo.close(); }

public int getNumeroRegistros() { return numeroRegistros; }

Archivos de Acceso Aleatorio


public boolean setAlumno(int i, Alumno alumno) throws IOException { if(i>=0 && i<=numeroRegistros) { if(alumno.tamao()+4 > tamaoRegistro) showMessageDialog(null, "Tamao de registro excedido, "Error", 0); else { flujo.writeUTF(alumno.getNumeroDNI()); flujo.writeUTF(alumno.getNombre());

Archivos de Acceso Aleatorio


flujo.writeInt(alumno.getCiclo()); return true; } } else showMessageDialog(null,"Numero del registro esta + fuera de limites", "Error", 0); return false;

Archivos de Acceso Aleatorio


public Alumno getAlumno(int i) throws IOException { if(i>=0 && i<=numeroRegistros) { flujo.seek(i * tamaoRegistro); String numeroDNI, nombre; int ciclo;
numeroDNI = flujo.readUTF();

nombre = flujo.readUTF(); ciclo = flujo.readInt(); return new Alumno(numeroDNI, nombre, ciclo); }


10

Archivos de Acceso Aleatorio


else {

showMessageDialog(null, "Numero de registro fuera de limites", "Error", 0); return null; }


}

11

Archivos de Acceso Aleatorio


public void aadirAlumno(Alumno alumno) throws IOException { if(setAlumno(numeroRegistros, alumno)) numeroRegistros++; }

12

Archivos de Acceso Aleatorio


public int buscarRegistro(String cadena, int pos) throws IOException { Alumno alumno; String nombre; if(cadena == null) return -1; if(pos < 0) pos = 0;

13

Archivos de Acceso Aleatorio


for(int registro=pos; registro<numeroRegistros; registro++) { alumno = getAlumno(registro); nombre = alumno.getNombre(); if(nombre.indexOf(cadena) > -1) return registro; } return -1; } }
14

También podría gustarte