UP | HOME

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:

  1. 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-8 o ASCII) 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).
  2. 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:

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:

  1. Si el nombre de la clase acaba en Stream (por ejemplo: FileInputStream, BufferedOutputStream) \(\rightarrow\) Trabaja con bytes (Ficheros binarios).
  2. Si el nombre de la clase acaba en Reader o Writer (por ejemplo: BufferedReader, FileWriter) \(\rightarrow\) Trabaja con caracteres (Ficheros de texto).

Author: Román Ginés Martínez Ferrández

Created: 2026-08-31 lun 16:27

Validate