Lectura/Escritura en Java: preámbulo y aclaraciones
Table of Contents
Tipos de ficheros según su codificación
Antes de empezar a leer y escribir datos en el disco con Java, es fundamental comprender qué tipo de información contiene el fichero sobre el que vamos a operar. En la práctica, todos los ficheros almacenan secuencias de ceros y unos (bytes), pero la forma en que el sistema operativo o nuestras aplicaciones interpretan esos bytes nos permite clasificarlos en dos grandes grupos:
- Ficheros de caracteres (o de texto):
- Contienen información interpretable directamente como caracteres legibles por personas (letras, números, símbolos).
- Utilizan una tabla de codificación de caracteres (como
UTF-8oASCII) para traducir cada número o conjunto de bytes a un gráfico visual. - Ejemplos: Ficheros de código fuente (
.java), datos estructurados (.json,.xml,.csv) o notas simples (.txt).
- Ficheros binarios:
- Almacenan la información directamente en el formato en el que la maneja el procesador o una aplicación específica, sin traducirla a una tabla de texto estándar.
- No son legibles abriéndolos en un editor de texto convencional (si los abres, verás caracteres extraños o símbolos "corruptos").
- Ejemplos: Imágenes (
.jpg,.png), audios (.mp3), ejecutables (.exe), PDFs o ficheros binarios propios creados por una aplicación.
En resumen: si un fichero puede abrirse, leerse y entenderse línea a línea en un bloc de notas común, es de texto. Si requiere un programa específico para descifrar la estructura interna de sus bytes (una imagen, un vídeo, una base de datos SQLite), se trata de un fichero binario.
Ficheros en Java
En Java existen multitud de clases, APIs y bibliotecas de utilidad para manejar y trabajar con ficheros. Al principio puede resultar un tanto abrumador y es normal no saber por dónde empezar.
Por ello, aquí, de manera escueta se presentan las clases principales que vamos a usar y para qué.
Gestión de rutas y utilidades directas
Existen dos clases fundamentales para la gestión de rutas y otras utilidades generales sobre archivos en Java, estas son:
Pathcuya documentación la encontrarás en la web con al documentación oficial de JavaFilesque también está documentada en la documentación oficial de Java
Estas clases las puedes usar en tus programas escritos con Java para, entre otras cosas:
- Acceso a ficheros por su ruta.
- Crear nuevas rutas.
- Concatenar rutas.
- Crear archivos y directorios.
- Borrar y mover archivos y directorios.
- Etc.
Ficheros de caracteres (texto plano)
Aquí, las clases que se usan hoy en día, en Java Moderno, son:
| Para lectura | Para escritura | Notas / Uso principal |
|---|---|---|
FileReader |
FileWriter |
Lectura/escritura básica orientada a caracteres. |
BufferedReader |
BufferedWriter |
Eficiente: usa búfer en memoria e incluye lectura por líneas (readline()) |
Files.lines() |
Files.writeString() |
Opciones modernas (Java 8+). lines() procesa mediante Streams de forma lazy |
Files.readString() |
Files.write() |
Opción moderna (Java 8+) para leer/escribir directamente todo el contenido de un fichero |
A lo largo de este tema vamos a usar las opciones modernas indicadas en la tabla de arriba.
¿Por qué usar un Búfer?
Acceder al disco físico por cada carácter individual es extremadamente lento. Las clases BufferedReader y BufferedWriter crean un contenedor intermedio en la memoria RAM (búfer) que agrupa múltiples datos antes de realizar el acceso real a disco, optimizando drásticamente el rendimiento.
Ficheros binarios
Cuando trabajamos con imágenes, audios, ejecutables o ficheros binarios propios, la información no se interpreta mediante caracteres de texto, sino como una secuencia pura de bytes (8 bits).
Las clases principales en Java para este propósito son:
| Para lectura | Para escritura | Notas / Uso principal |
|---|---|---|
FileInputStream |
FileOutputStream |
Lectura/escritura básica byte a byte o mediante arrays de bytes (byte[]). |
BufferedInputStream |
BufferedOutputStream |
Envoltorios que añaden búfer en memoria para mejorar el rendimiento de I/O. |
DataInputStream |
DataOutputStream |
Permite leer/escribir tipos de datos primitivos de Java (writeInt, writeDouble, readBoolean…). |
Files.readAllBytes() |
Files.write() |
Vía directa para leer o escribir un array de bytes completo con la API nio. |
Regla nemotécnica para las jerarquías de clases
Para no perderte en la enorme cantidad de clases de Java I/O, recuerda esta regla basada en sus nombres:
- Si el nombre de la clase acaba en Stream (por ejemplo:
FileInputStream,BufferedOutputStream) \(\rightarrow\) Trabaja con bytes (Ficheros binarios). - Si el nombre de la clase acaba en Reader o Writer (por ejemplo:
BufferedReader,FileWriter) \(\rightarrow\) Trabaja con caracteres (Ficheros de texto).