Introducción
Table of Contents
Manejar información y tratarla, así como almacenarla, es una de las tareas fundamentales por las que la Informática, como ciencia, ha ido creciendo a la largo de su historia. Esta información se almacena en dispositivos de almacenamiento secundario y es expuesta por los sistemas operativos (SO) por medio de una abstracción que conocemos como archivos o ficheros.
Todos los programas informáticos, en mayor o menor medida, trabajan con archivos y, es por ello que, tenemos que aprender a manejarlos en los programas que desarrollemos. Los programas que escribimos, en realidad, hacen uso de llamadas al sistema (es decir, al sistema operativo) para operar con los archivos: leer, escribir, modificar y borrar, básicamente.
En este tema aprenderás a escribir programas en Java que manejen archivos.
Antes de entrar de lleno en la programación se hace necesario explicar e introducir conceptos sobre el sistema de archivos del sistema operativo.
Sistema de archivos
Un sistema de archivos o sistema de ficheros, (File System en inglés), es un elemento que controla cómo se almacenan y recuperan los datos. Sin un sistema de archivos, los datos colocados en un medio de almacenamiento serían un gran cuerpo de datos sin manera de saber dónde termina un dato y comienza el siguiente. Es el encargado de administrar y facilitar el uso de las memorias secundarias.
Aquí nos topamos con un concepto fundamental: persistencia de datos. La memoria principal, coloquialmente llamada RAM, es una memoria muy rápida per volátil donde se encuentran los programas en ejecución y los datos sobre los que trabajan. Al cerrar la aplicación o apagar el equipo los datos desaparecen. Para conservarlos a largo plazo necesitamos aplicar el principio de persistencia, guardando la información en almacenamiento secundario (HDD, SSD, NVMe).
Como programadores en Java, no escribimos bytes directamente en las celdas físicas del disco. Le solicitamos al Sistema Operativo que realice estas operaciones mediante llamadas al sistema, apoyándonos en la abstracción que nos brinda el sistema de archivos.
Rutas relativas y absolutas
Los archivos tienen un nombre y una ruta en la que se encuentran: path. Esta ruta puede ser absoluta o relativa.
- Las rutas absolutas se indican desde la raíz del disco.
- Las rutas relativa, como su propio nombre indica, son rutas que se especifican desde un lugar dado (desde un directorio.
Las aplicaciones se ejecutan desde un directorio. Si usamos rutas relativas en nuestros programas tienes que tener en cuenta que parte desde el directorio en el que se ejecutó el programa.
No entraré en más detalles porque esta parte la estudiaste el curso pasado.
Una aclaración sobre los directorios
Un directorio es un archivo especial que contiene otros directorios y archivos. Esto permite organizar y formar una estructura jerárquica, nada más (y nada menos).
Versión de Java a usar
En este módulo vamos a usar la versión de Java 21 (LTS) como versión de referencia (o Java 21 LTS). Así, es obligatorio que todos los programas puedan ser construidos y ejecutados en Java 21.
La API de I/O de Java
La API I/O de Java es un conjunto de clases que podemos usar para acceder a recursos externos como son los sistemas de archivos y los recursos de red. En este tema nos interesa por lo primero.
I/O es el acrónimo de Input/Output que en español sería Entrada/Salida. No obstante es un término técnico y muy utilizado en la Informática en general y la programación en particular. Por ese motivo, en todo momento, voy a hacer mención a I/O (o simplemente IO), sin traducirlo.
Para simplificar, en vez de mencionar todo el tiempo la "API I/O de Java" voy a usar simplemente la "I/O de Java".
Aclarando el "lío" entre java.io y java.nio desde el principio
En la API I/O de Java se tienen dos paquetes, a saber: java.io y java.nio. Cuando busques información en la Web o acudas a cualquier bibliografía te puede generar cierta confusión. Básicamente, el primer paquete contiene las clases tradicionales y el segunda paquete las clases actuales y consideradas hoy en día modernas. Resumiendo:
java.io(I/O tradicional y orientada a flujos): se introdujo en Java 1.0 (1996). Es síncrona y bloqueante. Dentro de este paquete, clases comoFilese consideran hoy en día mecanismos legacy o clásicos. No están obsoletas formalmente (@Deprecated), pero han quedado desfasadas para la gestión del sistema de archivos.java.nio(nueva I/O) yjava.nio.file(NIO.2): se introdujo formalmente en Java 1.4 y se expandió drásticamente en Java 7 (con el llamado NIO.2). Es la API moderna y actual: utiliza la interfazPath, la clase de utilidadesFiles, soporta operaciones no bloqueantes, mejor manejo de excepciones, manipulación de atributos simbólicos y ofrece un rendimiento muy superior.
Por tanto, dado que nosotros vamos a escribir programas nuevos, vamos a usar la API moderna cuyas clases y utilidades encontramos en java.nio y java.nio.file.
Forma moderna y recomendada (a partir de Java 11)
Siguiendo con las aclaraciones y dejando claro desde el principio qué clases y metodologías de programación vamos a usar en este módulo, tengo que aclarar que en Java hay muchas formas de acceder a archivos y operar con ellos. Las clases y formas de instanciar que te voy a presentar en este módulo son las consideradas como modernas en Java.