Trabajar con Ficheros de Acceso Aleatorio

Los canales de entrada y salida que has aprendido hasta ahora en esta lección han sido canales de acceso secuencial -- canales cuyo contenido debe ser leido o escrito secuencialmente. Esto es increiblemente útil, los ficheros de acceso secuencial son consecuencia de un medio secuencial cómo una cinta magnética. Por otro lado, los ficheros de acceso aleatorio, permiten un acceso no secuencial, o aleatorio al contenido de un fichero.

Veamos por qué podríamos necesitar ficheros de acceso aleatorio. Consideremos el formato de archivo conocido como "zip". Los archivos Zip contienen ficheros que normalmente están comprimidos para ahorrar espacio. Estos archivos también contienen una "entrada de directorio" que indica donde comienzan los distintos ficheros contenidos dentro del archibo Zip:

Ahora supongamos que queremos extraer un fichero específico de un archivo Zip. Si utilizaramos un canal de acceso secuencial, tendría que hacer lo siguiente:

Como mínimo, utilizando este argumento, habremos tenido que leer medio archivo Zip antes de encontrar el fichero que quiere extraer. Se puede extraer el mismo fichero de un archivo Zip de una forma más eficiente utilizando la característica de búsqueda de un fichero de acceso aleatorio: Este algoritmo es mucho más eficiente porque sólo lee la entrada de directorio y el fichero que se quiere extraer.

La clase RandomAccessFile del paquete java.io implementa un fichero de acceso aleatorio.

Utilizar Ficheros de Acceso Aleatorio

Al contrario que las clases de canales de I/O de java.io, RandomAccessFile se utiliza tanto para leer como para escribir ficheros. Se puede crear el RandomAccessFile con diferentes argumentos dependiendo de lo que se intente hacer, leer o escribir.

Escribir Filtros para Ficheros de Acceso Aleatorio

RandomAccessFile está de alguna forma desconectado de los canales de I/O de java.io -- no desciende de las clases InputStream o OutputStream. Esto tiene alguna desventaja en que no se pueden aplicar los mismos filtros a RandomAccessFiles como se puede hacer con los otros canales. Sin embargo, RandomAccessFile implementa los interfaces DataInput y DataOutput, por lo que se podría de hecho diseñar un filtro que trabajando con DataInput o DataOutput podría trabajar (de alguna forma) con ficheros de acceso secuencial (los únicos que implementan DataInput o DataOutput) como con cualquier RandomAccessFile.


Ozito