folder-invoices-iconLos ficheros permiten guardar información en el disco duro del ordenador en el que se ejecute la aplicación. De esta manera se evita que se pierdan los datos una vez que se cierra la aplicación como sucede con la información que contienen las variables o los arrays, por ejemplo.

Abrir, operar y cerrar ficheros

Sobre los ficheros se pueden realizar acciones de lectura de los datos que contiene y escritura para almacenar información en ellos. Pero para hacer cualquiera de esas operaciones, previamente hay que abrir el fichero, para lo cual hay que crear un objeto indicando el fichero que se quiere utilizar así como una serie de posibles opciones como el modo en el que se quiere utilizar (lectura, escritura, ambas cosas, etc). Una vez que se hayan realizado las operaciones deseadas sobre el fichero, conviene realizar una última operación que es la de cerrarlo. La operación de cerrar un fichero es especialmente importante cuando se han guardado datos en él, ya que si no se cierra, puede que no se guarden definitivamente algunos de los datos.

Por tanto, siempre habrá que realizar los tres pasos siguientes para trabajar con un fichero:

  1. Abrir el fichero (creando un objeto de una determinada clase de acceso a ficheros)
  2. Realizar las operaciones de lectura, escritura, posicionamiento, etc.
  3. Cerrar el fichero.

Hay que destacar que una misma aplicación puede utilizar simultáneamente varios ficheros a la vez, accediendo a ellos en cualquier modo de operación.

Modos de acceso a los ficheros

Cuando se abre el acceso a un determinado fichero, hay que tener en cuenta si éste va a utilizarse únicamente para obtener la información que contiene, o si además se le va a dar permisos a la aplicación para que modifique los datos que contiene. Es lo que se llama acceder al fichero en modo lectura, en modo escritura, o en modo lectura/escritura.

Modos de acceso a los datos

El acceso a los datos que contiene un fichero se puede hacer de modo secuencial o en modo directo.

GraficoFile-Buffered_2En el modo secuencial, la lectura de los datos se hace empezando desde el primer elemento y sucesivamente se podrán ir obteniendo los demás en el orden en el que se encuentren. Es decir, para acceder a un elemento del fichero que se encuentre en la mitad del fichero, previamente es necesario recorrer todos los elementos anteriores. Por otro lado, la grabación de los datos siempre se hará al final del fichero.

En cambio en el modo de acceso directo, es posible obtener un determinado elemento del fichero conociendo su posición sin tener que recorrer todos sus elementos anteriores. De igual forma, es posible modificar directamente cualquier elemento conociendo su posición.

Marcador de posición

En todas las operaciones sobre ficheros interviene un marcador de posición que indica el lugar del fichero sobre el que se va a realizar una operación de lectura o escritura. Es decir, al realizar una lectura, se obtendrán los datos que se encuentran en el lugar señalado por dicho marcador. Al realizar una operación de escritura, los datos se guardarán en la posición indicada por él.

Cada vez que se hace una operación de lectura o escritura sobre el fichero, el marcado avanza automáticamente a la siguiente posición que debe ser leída o la siguiente posición en la que debe realizarse la escritura.

Ese marcador puede moverse libremente en los ficheros de acceso directo.

Al acceder por primera vez al contenido de un fichero (al abrir el fichero), el marcador se encontrará al inicio del fichero, señalando al primer elemento que se encuentre.

Clases java para manipulación de ficheros

Java dispone de una serie de clases específicas para realizar operaciones sobre ficheros alojados localmente, que se deben elegir en función del tipo de información que se va a manipular y el modo de acceso a la misma.

  • FileReader: Para lectura de ficheros con información basada en caracteres de manera secuencial.
  • FileWriter: Para escribir en ficheros información basada en caracteres de manera secuencial.
  • FileInputStream: Para lectura de ficheros con datos binarios de manera secuencial.
  • FileOutputStream: Para escritura en ficheros de datos binarios de manera secuencial.
  • RandomAccessFile: Permite hacer operaciones de lectura, escritura, y lectura/escritura sobre ficheros con acceso directo a cualquier tipo de dato.
  • File: Permite realizar operaciones de manipulación sobre los archivos y carpetas encontrados en los dispositivos de almacenamiento del ordenador, tales como operaciones de borrado, renombrado, creación de carpetas, obtención del tamaño, nombre, ruta, etc.

Las clases FileReader, FileInputStream, FileWriter o FileOuputStream,hacen las operaciones de lectura o escritura directamente sobre el dispositivo de almacenamiento, por lo que si la aplicación hace estas operaciones de forma muy repetida y para una cantidad de información pequeña en cada operación, se hacen muchas operaciones directas que hacen más lenta la ejecución de la aplicación. Para mejorar esta situación, se pueden utilizar, junto con las clases anteriores, las clases BufferedReader, BufferedInputStream, BufferedWriter y BufferedOutputStream que utilizan un buffer de forma que en las operaciones de lectura se almacenan más datos de los que realmente se necesitan en un momento determinado, de forma, que en una siguiente operación de lectura es posible que esos datos ya estén en memoria y no sea necesario acceder de nuevo al dispositivo de almacenamiento. En las operaciones de escritura, los datos se van guardando en memoria y no se vuelcan al dispositivo hasta que hay una cantidad suficente de datos para mejorar el rendimiento.

GraficoFile-Buffered_1