## 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:

- Abrir el archivo Zip.
- Buscar a través del archivo Zip hasta que se localice el fichero que quiere extraer.
- Extraer el Fichero.
- Cerar el archivo Zip.

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:

- Abrir el archvivo Zip.
- Buscar en la entrada de directorio y localizar la entrada para el fichero que quiere extraer.
- Buscar (hacia atrás) dentro del archivo Zip hasta la posición del fichero a extraer.
- Extraer el fichero.
- Cerrar el archivo Zip.

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