CodeGym /Cursos /JAVA 25 SELF /Recodificación de archivos: lectura en una codificación, ...

Recodificación de archivos: lectura en una codificación, escritura en otra

JAVA 25 SELF
Nivel 37 , Lección 4
Disponible

1. Introducción

Imagina que has recibido del contable un archivo con un informe que se guardó en «Windows-1251» (una codificación antigua para el cirílico). Tu aplicación Java espera toda la entrada en «UTF-8»; de lo contrario, empieza a quejarse y a mostrar caracteres extraños en lugar de letras. O, por ejemplo, te integras con un sistema que solo acepta «ISO-8859-1». ¿Qué hacer? ¡Por supuesto, recodificar el archivo!

La recodificación es el proceso por el cual lees texto de un archivo en una codificación y lo guardas en otra codificación. Es como reescribir una carta de un idioma a otro para que el destinatario entienda exactamente tu mensaje.

Cómo funciona la recodificación en Java: enfoque general

En Java, las cadenas (String) dentro del programa siempre se almacenan en Unicode (UTF‑16). Esto significa que, una vez leído el texto desde un archivo, ya es «universal» y puede escribirse en cualquier codificación compatible. Por eso, la recodificación es simplemente:

  • Leer el archivo como cadenas, indicando la codificación de origen correcta.
  • Escribir esas cadenas en un archivo nuevo, indicando explícitamente la codificación de destino necesaria.

Esquema:

[Archivo en codificación A] --(lectura con Charset A)--> [String en memoria] --(escritura con Charset B)--> [Archivo en codificación B]

2. Algoritmo paso a paso de recodificación

Paso 1. Determinar la codificación de origen y de destino
La codificación de origen es aquella en la que se guardó el archivo original (por ejemplo, «Windows-1251»). La codificación de destino es aquella en la que quieres obtener el resultado (por ejemplo, «UTF-8»).

Paso 2. Abrir un flujo de lectura con la codificación adecuada
Usa Files.newBufferedReader(Path, Charset) o el clásico InputStreamReader.

Paso 3. Abrir un flujo de escritura con la codificación adecuada
Usa Files.newBufferedWriter(Path, Charset) o el clásico OutputStreamWriter.

Paso 4. Leer las líneas y escribirlas en el archivo nuevo
Lee línea a línea (o todo de una vez si el archivo es pequeño) y escribe cada línea en el archivo nuevo.

Paso 5. Cerrar los flujos (mejor usar try-with-resources)
Así garantizas la liberación correcta de los recursos. Aplica la construcción try-with-resources.

3. Ejemplo de código: recodificación Windows-1251 → UTF-8

Vamos a implementar un programa sencillo que recodifique un archivo de Windows‑1251 a UTF‑8. Este ejemplo es muy habitual en la práctica, especialmente si trabajas con datos en ruso.

import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;

public class FileReencoder {
    public static void main(String[] args) throws IOException {
        // Rutas de archivos
        Path inputPath = Paths.get("input-1251.txt");
        Path outputPath = Paths.get("output-utf8.txt");

        // Abrimos el reader con la codificación de origen Windows-1251
        try (
            BufferedReader reader = Files.newBufferedReader(inputPath, Charset.forName("Windows-1251"));
            BufferedWriter writer = Files.newBufferedWriter(outputPath, StandardCharsets.UTF_8)
        ) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // no olvides el salto de línea
            }
        }

        System.out.println("¡El archivo se ha recodificado correctamente de Windows-1251 a UTF-8!");
    }
}

Aquí indicamos explícitamente la codificación para la lectura (Charset.forName("Windows-1251")) y para la escritura (StandardCharsets.UTF_8). Luego usamos try-with-resources para que los flujos se cierren automáticamente incluso si hay errores. writer.newLine() — añade un salto de línea para conservar la estructura del archivo.

4. Aspectos importantes y consejos prácticos

¿Cómo saber la codificación de origen de un archivo?

  • El propio archivo no contiene una «etiqueta» con la codificación (la excepción es el BOM, pero no siempre está).
  • Si tú creaste el archivo, usa la misma codificación que empleaste al guardarlo.
  • Si el archivo llegó «de algún sitio», intenta abrirlo en un editor que muestre la codificación (por ejemplo, Notepad++, Visual Studio Code).
  • En Linux puedes usar el comando file -i nombre_de_archivo, pero no siempre detecta la codificación correctamente.

¿Qué ocurre si especificas una codificación de origen incorrecta?

Obtendrás «mojibake» (caracteres ilegibles) o pérdida de símbolos. Por ejemplo, si lees como UTF‑8 un archivo guardado en Windows‑1251, el cirílico se convertirá en "Привет".

Gestión de excepciones

Al trabajar con archivos, siempre pueden producirse errores: archivo no encontrado, falta de permisos, codificación incorrecta. Usa el manejo de excepciones (try-catch) o propágalas hacia arriba (throws) para que la aplicación no se caiga «sin explicación».

Trabajo con archivos grandes

Si el archivo es enorme (¡gigabytes!), usa lectura y escritura línea a línea, como en los ejemplos mostrados. No leas todo el archivo en memoria de una vez, de lo contrario obtendrás OutOfMemoryError.

Recodificación «sobre la marcha» (streaming)

Si el archivo es muy grande, ni siquiera hace falta crear un archivo intermedio; puedes leer y escribir «sobre la marcha», por ejemplo, al procesar datos en flujo desde la red.

5. Errores típicos al recodificar archivos

Error n.º 1: codificación de origen incorrecta. Si te equivocas con la codificación de origen, el resultado será desastroso: "niño" puede convertirse en "niño". Averigua siempre en qué codificación se creó el archivo.

Error n.º 2: Uso implícito de la codificación del sistema. Si no indicas la codificación explícitamente, Java usa la del sistema por defecto (System.getProperty("file.encoding")). Esto puede dar resultados distintos en diferentes equipos (por ejemplo, en Windows — cp1251, en Linux — UTF‑8).

Error n.º 3: Leer y escribir todo el archivo en memoria. Para archivos grandes, este enfoque llevará a un desbordamiento de memoria. Usa lectura y escritura línea a línea.

Error n.º 4: Excepciones no gestionadas. Los archivos pueden no existir, estar usados por otros procesos o contener caracteres corruptos. Gestiona siempre las excepciones o usa try-with-resources.

Error n.º 5: Recodificar archivos binarios. ¡No intentes recodificar imágenes, PDF, archivos comprimidos y otros binarios! Esto los corromperá. La recodificación solo tiene sentido para archivos de texto.

1
Cuestionario/control
Trabajo con codificaciones, nivel 37, lección 4
No disponible
Trabajo con codificaciones
Trabajo con codificaciones
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION