CodeGym /Kurse /JAVA 25 SELF /Zeichencodierung beim Lesen/Schreiben von Dateien festleg...

Zeichencodierung beim Lesen/Schreiben von Dateien festlegen

JAVA 25 SELF
Level 37, Lektion 2
Verfügbar

1. Einleitung

Seien wir ehrlich: Wenn Sie statt russischem Text etwas wie Привет gesehen haben, sind Sie bereits Opfer einer falschen Zeichenkodierung. Das passiert, wenn eine Datei in einer Kodierung geschrieben, aber in einer anderen gelesen wird. Zum Beispiel wurde die Datei als UTF-8 gespeichert, aber als Windows-1251 gelesen – oder umgekehrt.

Java verwendet standardmäßig die Systemcodierung, die man so herausfindet:

System.out.println(System.getProperty("file.encoding"));

Auf einem Rechner kann das UTF-8 sein, auf einem anderen – Windows-1251, und anderswo – ISO-8859-1. Deshalb ist es immer besser, die Kodierung explizit anzugeben. Das ist besonders wichtig, wenn Sie mit mehrsprachigen Daten arbeiten, wenn Dateien auf unterschiedlichen Rechnern oder in verschiedenen Programmen verwendet werden, oder wenn Ihr Code sich in jeder Umgebung gleich verhalten soll – nicht nur auf Ihrer Maschine.

Die Klasse Charset: Ihr Freund in der Welt der Kodierungen

In Java wird für die Arbeit mit Kodierungen die Klasse java.nio.charset.Charset verwendet. Sie erlaubt, die Kodierung sowohl per Name anzugeben (z. B. "UTF-8") als auch über Standardkonstanten (StandardCharsets.UTF_8).

Beispiele für Standard-Kodierungen:

Kodierung Java-Konstante
UTF-8
StandardCharsets.UTF_8
UTF-16
StandardCharsets.UTF_16
ISO-8859-1
StandardCharsets.ISO_8859_1
Windows-1251
Charset.forName("Windows-1251")

Die Verwendung von Konstanten ist vorzuziehen: geringere Chance auf Tippfehler und keine UnsupportedCharsetException.

2. Dateien lesen mit expliziter Kodierung

Ältere Vorgehensweise:

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

BufferedReader reader = new BufferedReader(
    new InputStreamReader(
        new FileInputStream("example.txt"),
        StandardCharsets.UTF_8 // <-- Kodierung explizit angeben
    )
);

Moderne Vorgehensweise:

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

BufferedReader reader = Files.newBufferedReader(
    Paths.get("example.txt"),
    StandardCharsets.UTF_8 // <-- Kodierung explizit angeben
);

Es wird empfohlen, die zweite Methode zu verwenden – sie ist kürzer, sicherer und lässt sich bequem mit try-with-resources kombinieren.

Beispiel: eine Zeile aus der Datei lesen

try (BufferedReader reader = Files.newBufferedReader(
        Paths.get("hello.txt"),
        StandardCharsets.UTF_8)) {
    String line = reader.readLine();
    System.out.println("Gelesen: " + line);
}

Warum das wichtig ist: Wenn die Datei in UTF-8 gespeichert wurde, Sie sie aber als Windows-1251 lesen, werden kyrillische Zeichen verfälscht. Wenn Sie die richtige Kodierung angeben, wird der Text auf jedem Betriebssystem korrekt gelesen.

3. Dateien schreiben mit expliziter Kodierung

Ältere Vorgehensweise:

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

BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(
        new FileOutputStream("example.txt"),
        StandardCharsets.UTF_8 // <-- Kodierung explizit angeben
    )
);

Moderne Vorgehensweise:

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

BufferedWriter writer = Files.newBufferedWriter(
    Paths.get("example.txt"),
    StandardCharsets.UTF_8 // <-- Kodierung explizit angeben
);

Beispiel: eine Zeile in die Datei schreiben

try (BufferedWriter writer = Files.newBufferedWriter(
        Paths.get("hello.txt"),
        StandardCharsets.UTF_8)) {
    writer.write("Hallo, Welt!");
}

Ergebnis: Die Datei wird in UTF-8 gespeichert und kann in jedem Editor, der UTF-8 unterstützt, korrekt geöffnet werden.

4. Nützliche Details

Unterstützte Kodierungen ermitteln

import java.nio.charset.Charset;

public class ListCharsets {
    public static void main(String[] args) {
        System.out.println("Verfügbare Kodierungen:");
        Charset.availableCharsets().forEach((name, charset) -> System.out.println(name));
    }
}

Tipp: Wenn Sie eine exotische Kodierung verwenden (z. B. für uralte chinesische Schriftzeichen oder marsianische Emojis), prüfen Sie, ob sie von Ihrer JVM unterstützt wird.

try-with-resources verwenden: Streams nicht offen lassen

Bei der Arbeit mit Dateien ist es wichtig, Streams zu schließen, damit es keine Ressourcenlecks gibt. Moderner Java-Code verwendet die Konstruktion try-with-resources:

try (BufferedReader reader = Files.newBufferedReader(path, charset)) {
    // Mit der Datei arbeiten
}

Der Stream wird automatisch geschlossen, selbst wenn ein Fehler auftritt.

Empfehlungen

  • Geben Sie die Kodierung beim Lesen und Schreiben von Dateien möglichst immer explizit an, selbst wenn Sie sicher sind, dass „standardmäßig alles funktioniert“.
  • Verwenden Sie UTF-8 für neue Dateien – das ist de facto der Standard, insbesondere wenn Sie mit Web, JSON, XML arbeiten oder möchten, dass Ihre Dateien überall lesbar sind.
  • Für alte Dateien (z. B. Exporte aus 1C, alten Datenbanken, CSV aus Windows) verwenden Sie die Kodierung, in der sie gespeichert wurden (z. B. Windows-1251, ISO-8859-1).
  • Verwenden Sie keine veralteten Klassen, bei denen die Kodierung nicht explizit gesetzt wird: FileReader/FileWriter. Setzen Sie stattdessen InputStreamReader/OutputStreamWriter mit expliziter Kodierung oder Methoden aus Files ein.
  • Für große Dateien verwenden Sie Pufferung (BufferedReader/BufferedWriter), damit nicht der gesamte Speicher aufgefressen wird.

5. Häufige Fehler beim Umgang mit Kodierungen

Fehler Nr. 1: Keine Kodierung beim Lesen/Schreiben der Datei angegeben.
Wenn keine Kodierung angegeben ist, verwendet Java die systemweite Standardkodierung ("file.encoding"). Auf Ihrem Rechner funktioniert alles, beim Kollegen – „Zeichensalat“.

Fehler Nr. 2: Nicht übereinstimmende Kodierungen beim Lesen und Schreiben.
Die Datei wurde in einer Kodierung geschrieben, aber in einer anderen gelesen. Zum Beispiel wurde sie in UTF-8 geschrieben, aber als Windows-1251 gelesen – kyrillische Zeichen werden verfälscht.

Fehler Nr. 3: Verwendung der veralteten Klassen FileReader/FileWriter.
Diese Klassen erlauben es nicht, die Kodierung explizit anzugeben – ihre Verwendung wird nicht empfohlen. Verwenden Sie stattdessen InputStreamReader/OutputStreamWriter mit Angabe der Kodierung oder Methoden aus Files.

Fehler Nr. 4: Schreibfehler im Namen der Kodierung.
Zum Beispiel "utf8" statt "UTF-8" oder "win1251" statt "Windows-1251". Java wirft eine UnsupportedCharsetException.

Fehler Nr. 5: Stream nicht geschlossen – Datei wurde nicht geschrieben.
Wenn Sie try-with-resources nicht verwenden oder den Stream nicht explizit schließen, wird ein Teil der Daten unter Umständen nicht auf die Festplatte geschrieben.

1
Aufgabe
JAVA 25 SELF, Level 37, Lektion 2
Gesperrt
Audit der Systemeinstellungen der Java-Maschine 🖥️
Audit der Systemeinstellungen der Java-Maschine 🖥️
1
Aufgabe
JAVA 25 SELF, Level 37, Lektion 2
Gesperrt
Atlas der digitalen Sprachen: Überblick über unterstützte Zeichencodierungen 🗺️
Atlas der digitalen Sprachen: Überblick über unterstützte Zeichencodierungen 🗺️
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION