CodeGym /Kurse /JAVA 25 SELF /Transkodierung von Dateien: Lesen in einer Kodierung, Sch...

Transkodierung von Dateien: Lesen in einer Kodierung, Schreiben in einer anderen

JAVA 25 SELF
Level 37, Lektion 4
Verfügbar

1. Einleitung

Stellen Sie sich vor, Sie haben von der Buchhaltung eine Datei mit einem Bericht erhalten, die in "Windows-1251" gespeichert wurde (eine ältere Kodierung für Kyrillisch). Ihre Java‑Anwendung erwartet alle Eingabedaten in "UTF-8", andernfalls beginnt sie zu „meckern“ und zeigt statt Buchstaben Hieroglyphen an. Oder Sie integrieren sich z. B. mit einem System, das nur "ISO-8859-1" akzeptiert. Was tun? Natürlich die Datei transkodieren!

Transkodierung – das ist der Prozess, bei dem Sie Text aus einer Datei in einer Kodierung lesen und ihn in einer anderen Kodierung speichern. Es ist, als würden Sie einen Brief von einer Sprache in eine andere abschreiben, damit der Empfänger Ihre Botschaft sicher versteht.

Wie Transkodierung in Java funktioniert: allgemeiner Ansatz

In Java werden Zeichenketten (String) innerhalb des Programms immer in Unicode (UTF‑16) gespeichert. Das bedeutet: Sobald Sie Text aus einer Datei gelesen haben, ist er bereits „universell“ und kann in jede unterstützte Kodierung geschrieben werden. Daher ist Transkodierung einfach:

  • Datei als Strings lesen und dabei die richtige Quellkodierung angeben.
  • Diese Strings in eine neue Datei schreiben und dabei die gewünschte Zielkodierung explizit angeben.

Schema:

[Datei in Kodierung A] --(Lesen mit Charset A)--> [String im Speicher] --(Schreiben mit Charset B)--> [Datei in Kodierung B]

2. Schritt-für-Schritt-Algorithmus der Transkodierung

Schritt 1. Quell- und Zielkodierung bestimmen
Die Quellkodierung ist die, in der die Ausgangsdatei gespeichert wurde (z. B. "Windows-1251"). Die Zielkodierung ist die, in der Sie das Ergebnis erhalten möchten (z. B. "UTF-8").

Schritt 2. Lesestream mit der benötigten Kodierung öffnen
Verwenden Sie Files.newBufferedReader(Path, Charset) oder den klassischen InputStreamReader.

Schritt 3. Schreibestream mit der benötigten Kodierung öffnen
Verwenden Sie Files.newBufferedWriter(Path, Charset) oder den klassischen OutputStreamWriter.

Schritt 4. Zeilen lesen und in die neue Datei schreiben
Lesen Sie zeilenweise (oder komplett – wenn die Datei klein ist) und schreiben Sie jede Zeile in die neue Datei.

Schritt 5. Streams schließen (am besten try-with-resources verwenden)
So wird die korrekte Freigabe von Ressourcen gewährleistet. Nutzen Sie die Konstruktion try-with-resources.

3. Codebeispiel: Transkodierung Windows-1251 → UTF-8

Lassen Sie uns ein einfaches Programm implementieren, das eine Datei von Windows‑1251 nach UTF‑8 transkodiert. Ein solches Beispiel kommt in der Praxis häufig vor, insbesondere wenn Sie mit russischsprachigen Daten arbeiten.

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 {
        // Dateipfade
        Path inputPath = Paths.get("input-1251.txt");
        Path outputPath = Paths.get("output-utf8.txt");

        // Reader mit Quellkodierung Windows-1251 öffnen
        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(); // Zeilenumbruch nicht vergessen!
            }
        }

        System.out.println("Die Datei wurde erfolgreich von Windows-1251 nach UTF-8 transkodiert!");
    }
}

Hier geben wir die Kodierung für das Lesen (Charset.forName("Windows-1251")) und für das Schreiben (StandardCharsets.UTF_8) explizit an. Anschließend verwenden wir try-with-resources, damit sich die Streams auch bei Fehlern automatisch schließen. writer.newLine() – Zeilenumbruch, damit die Struktur der Datei erhalten bleibt.

4. Wichtige Details und Tipps

Wie ermittelt man die Quellkodierung einer Datei?

  • Eine Datei trägt in der Regel kein „Label“ mit der Kodierung (Ausnahme: BOM, kommt aber nicht immer vor).
  • Wenn Sie die Datei selbst erstellt haben – verwenden Sie dieselbe Kodierung wie beim Schreiben.
  • Wenn die Datei „von irgendwoher“ stammt – öffnen Sie sie in einem Editor, der die Kodierung anzeigt (z. B. Notepad++, Visual Studio Code).
  • Unter Linux kann man den Befehl file -i dateiname verwenden, aber er erkennt die Kodierung nicht immer korrekt.

Was passiert, wenn die falsche Quellkodierung angegeben wird?

Sie erhalten „Zeichensalat“ oder es gehen Zeichen verloren. Wenn Sie z. B. eine in Windows-1251 gespeicherte Datei als UTF‑8 lesen, wird Kyrillisch zu "Привет".

Ausnahmebehandlung

Bei der Arbeit mit Dateien sind Fehler immer möglich: Datei nicht gefunden, keine Berechtigungen, falsche Kodierung. Verwenden Sie eine Ausnahmebehandlung (try-catch) oder werfen Sie die Ausnahmen weiter (throws), damit die Anwendung nicht „ohne Erklärung“ abstürzt.

Arbeiten mit großen Dateien

Wenn die Datei riesig ist (Gigabytes!), verwenden Sie zeilenweises Lesen und Schreiben, wie in den Beispielen gezeigt. Lesen Sie nicht die gesamte Datei vollständig in den Speicher – sonst riskieren Sie eine OutOfMemoryError.

Transkodierung „on the fly“ (Streaming)

Wenn die Datei sehr groß ist, müssen Sie nicht einmal eine Zwischen­datei erzeugen, sondern können „on the fly“ lesen und schreiben – z. B. bei der Streaming-Verarbeitung von Daten aus dem Netz.

5. Typische Fehler bei der Transkodierung von Dateien

Fehler Nr. 1: Falsche Quellkodierung. Wenn Sie sich bei der Quellkodierung irren, ist das Ergebnis unschön: „Hello“ wird zu "Привет". Finden Sie immer heraus, in welcher Kodierung die Datei erstellt wurde.

Fehler Nr. 2: Implizite Verwendung der Systemkodierung. Wenn Sie die Kodierung nicht explizit angeben, verwendet Java standardmäßig die Systemkodierung (System.getProperty("file.encoding")). Das kann auf verschiedenen Rechnern zu unterschiedlichen Ergebnissen führen (z. B. unter Windows – cp1251, unter Linux – UTF‑8).

Fehler Nr. 3: Den gesamten Dateiinhalt in den Speicher lesen/schreiben. Bei großen Dateien führt dieser Ansatz zum Speicherüberlauf. Verwenden Sie zeilenweises Lesen und Schreiben.

Fehler Nr. 4: Nicht behandelte Ausnahmen. Dateien können nicht existieren, von anderen Prozessen belegt sein oder fehlerhafte Zeichen enthalten. Behandeln Sie Ausnahmen immer oder verwenden Sie try-with-resources.

Fehler Nr. 5: Transkodierung binärer Dateien. Versuchen Sie nicht, Bilder, PDFs, Archive und andere Binärdateien zu transkodieren! Das führt zu Beschädigungen. Transkodierung ergibt nur bei Textdateien Sinn.

1
Aufgabe
JAVA 25 SELF, Level 37, Lektion 4
Gesperrt
Digitaler Archivar: Migration alter Dokumente in ein neues Format 🏛️
Digitaler Archivar: Migration alter Dokumente in ein neues Format 🏛️
1
Aufgabe
JAVA 25 SELF, Level 37, Lektion 4
Gesperrt
Rettung digitaler Daten: Sichere Rekodierung mit Ausfallschutz 🚨
Rettung digitaler Daten: Sichere Rekodierung mit Ausfallschutz 🚨
1
Umfrage/Quiz
Arbeiten mit Kodierungen, Level 37, Lektion 4
Nicht verfügbar
Arbeiten mit Kodierungen
Arbeiten mit Kodierungen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION