0Pricing
Java Academy · Lektion

Streams sicher schließen

try-with-resources.

Streams sicher schließen ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Streams geschlossen werden

Streams wie BufferedReader halten Ressourcen des Systems belegt — Dateihandles, Speicherpuffer und Verbindungen. Wenn Sie sie nie schließen, können diese Ressourcen verloren gehen.

Beim Schließen eines Streams werden die von ihm belegten Ressourcen freigegeben und ausstehende Daten geschrieben. In dieser Lektion erfahren Sie, wie Sie das sicher erledigen.

Die close-Methode

Jeder Reader besitzt eine close()-Methode. Wenn Sie sie aufrufen, wird die Ressource freigegeben.

Bei einem BufferedReader, der System.in umschließt, werden dadurch auch die zugrunde liegenden Streams geschlossen.

BufferedReader br =
    new BufferedReader(new InputStreamReader(System.in));
// ... use br ...
br.close();

Der alte, riskante Weg

Sie könnten close() manuell aufrufen. Wenn jedoch ein Fehler auftritt, bevor diese Zeile ausgeführt wird, wird close() übersprungen und die Ressource geht verloren.

Wenn Sie close() in einen finally-Block setzen, hilft das zwar, ist aber ausführlich und leicht fehleranfällig.

BufferedReader br = null;
try {
    br = new BufferedReader(
        new InputStreamReader(System.in));
    // ... use br ...
} finally {
    if (br != null) br.close();
}

try-with-resources

Java bietet eine sauberere Lösung: try-with-resources. Sie deklarieren den Stream in Klammern hinter try, und Java schließt ihn automatisch, sobald der Block endet — auch wenn ein Fehler auftritt.

Kein finally, kein manueller Aufruf von close(). Das ist heute die empfohlene Vorgehensweise.

try (BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in))) {
    String line = br.readLine();
    System.out.println(line);
}

So funktioniert es

Jede Ressource, die in den Klammern von try (...) deklariert wird, muss AutoCloseable implementieren. Das ist bei BufferedReader der Fall, daher ruft Java dessen close()-Methode für Sie auf.

Das Schließen erfolgt, nachdem der Block beendet wurde, unabhängig davon, ob er normal oder aufgrund einer Ausnahme endet.

Ein vollständiges Beispiel

Hier sehen Sie ein vollständiges Programm, das mit try-with-resources eine Zeile einliest. Der Reader wird am Ende des Blocks automatisch geschlossen.

Das Programm liest aus System.in, wartet also auf eine Eingabe und kann hier nicht automatisch ausgeführt werden.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in))) {
            String name = br.readLine();
            System.out.println("Hi " + name);
        }
    }
}

Mit StringReader ausführbar

Um zu zeigen, dass try-with-resources auch ohne Tastatureingabe funktioniert, wird hier aus einem StringReader gelesen. Dieses Beispiel ist vollständig ausführbar.

Nach dem Block wird der Reader automatisch geschlossen — Sie müssen keinen Aufruf von close() schreiben.

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br =
                new BufferedReader(new StringReader("done"))) {
            System.out.println(br.readLine());
        }
    }
}

Mehrere Ressourcen

Sie können mehrere Ressourcen in einem try-Block deklarieren und durch Semikolons trennen. Java schließt sie alle in der umgekehrten Reihenfolge ihrer Deklaration.

Das ist praktisch, wenn Sie mehrere Streams ineinander verschachteln.

try (InputStreamReader isr =
        new InputStreamReader(System.in);
     BufferedReader br = new BufferedReader(isr)) {
    System.out.println(br.readLine());
}

IOException abfangen

Beim Lesen kann IOException ausgelöst werden. Sie können einem try-with-resources-Block einen catch-Block hinzufügen, um die Ausnahme zu behandeln, anstatt throws zu deklarieren.

Die Ressource wird weiterhin automatisch geschlossen, bevor der catch-Block ausgeführt wird.

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in))) {
    System.out.println(br.readLine());
} catch (IOException e) {
    System.out.println("Read failed");
}

Sollten Sie System.in schließen?

Eine wichtige Einschränkung: Wenn Sie einen Reader für System.in schließen, wird auch System.in selbst geschlossen und kann nicht erneut geöffnet werden.

Für kurze Programme ist das unproblematisch. Wenn Sie später jedoch noch Konsoleneingaben benötigen, schließen Sie diesen bestimmten Reader nicht. Achten Sie darauf, welchen Stream Ihr Reader umschließt.

Bewährte Vorgehensweisen

So gehen Sie sicher mit Streams um:

  • Bevorzugen Sie try-with-resources gegenüber einem manuellen Aufruf von close().
  • Der Stream wird auch dann automatisch geschlossen, wenn Fehler auftreten.
  • Denken Sie daran, dass das Schließen eines Readers für System.in die Standardeingabe schließt.

Eine saubere Ressourcenverwaltung verhindert Ressourcenverluste und Fehler.

Kurzer Test

Überlegen Sie, worin der wichtigste Vorteil von try-with-resources besteht.

Zusammenfassung

Sie haben gelernt, warum Streams geschlossen werden müssen, warum der riskante manuelle Ansatz mit finally problematisch ist und wie das saubere try-with-resources-Muster AutoCloseable-Ressourcen automatisch schließt.

Jetzt können Sie Eingaben mit BufferedReader von Anfang bis Ende sicher lesen.

Häufig gestellte Fragen

Ist die Lektion „Streams sicher schließen“ kostenlos?

Ja — der vollständige Text von „Streams sicher schließen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Streams sicher schließen“?

try-with-resources. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Streams sicher schließen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Warum BufferedReader
  2. Zeilen lesen
  3. Zahlen aus Eingaben parsen
  4. Streams sicher schließen
← Zurück zu Java Academy