Wann soll ich den Stream schließen, wenn ich das in einer Methode habe?

berserkerdq2

Bekanntes Mitglied
Hi, ich habe eine Methode, der ich einen Pfad übergebe und die dann den Pfad einliest und mit diesem arbeitet.

Mein Problem ist nun, wenn ich in der Methode den reader close, so kann ich die Methode nicht verwenden, da ich die IOexception erhalte, dass der stream geschlossen ist.

Wenn ich es nicht schließe klappt es, aber soll ich nun durchgehend den Stream geöffnet lassen, dass ist ja auch blöd, gibts da eine Möglichkeit?
 
Beste Antwort
Achso, wenn ich einen catch habe, schließt es sich automatisch?
Bei try with resources: Ja. Aber bei einem einfachen try / catch Block passiert nichts, was da nicht explizit an Code steht. Da wäre also der korrekte Code (dem dieses try with resources auch entspricht):
Java:
public static String[] test(String optimal){
    BufferedReader nummerEins;
    try{
        nummerEins = new BufferedReader(new FileReader(optimal));
        ...
    }catch (IOException e){
        e.printStackTracke();
    } finally {
        try {
            if (nummerEins != null) nummerEins.close();
        } catch (Exception ex) {}
    }
}

Hier wird immer geschlossen - egal ob eine Exception auftritt oder nicht. Und wenn dabei eine Exception auftritt...
Liefere da doch bitte erst einmal mehr Details.

Generell schliesst Du nur Dinge, die "Dir gehören". Also wenn Du etwas von außen bekommst, dann lässt Du es offen. Eine Methode, die einen Stream bekommt, schließt diesen nicht.

Problematisch ist es bei verschachtelten Aufbau. Bestes Beispiel ist der Scanner auf System.in. Der Scanner gehört Dir, denn den hast du ja erstellt, aber das Schließen des Scanners schliesst auch den zugrunde liegenden Stream.
 
[CODE lang="java" title="BeispielCode"]public static String[] test(String optimal){
try{
BufferedReader nummerEins = new BufferedReader(new FileReader(optimal));
...
nummerEins.close() // Wenn ich hier jetzt close habe, kann ich optimal nicht mehr da bei Filereader reintun
}catch (IOException e){
e.printStackTracke();
}
}[/CODE]

Java:
test("Testpath"); //Jetzt würde eine Fehlermeldung kommen, dass der Stream geschlossen ist.
Mein Problem ist nur, soll ich das dann gar`nicht schließen?

(Habe jetzt natürlich den Code nicht vollständig, theoretisch müsste da noch ein Rückgabewert hin, aber mein Problem ist nur das close, wenn ich das setze, kann ich die Methode nicht mehr verwenden, da Stream geschlossen ist.
 
Also erst einmal solltest Du direkt try with resources verwenden:
Java:
public static String[] test(String optimal){
    try(BufferedReader nummerEins = new BufferedReader(new FileReader(optimal))) {
        ...
    }catch (IOException e){
        e.printStackTracke();
    }
}

Damit wird das automatisch geschlossen. Und da ist auch nichts offen zu halten - das ist ja eine lokale Variable die außerhalb des Blockes nicht mehr existiert!
 
Also erst einmal solltest Du direkt try with resources verwenden:
Java:
public static String[] test(String optimal){
    try(BufferedReader nummerEins = new BufferedReader(new FileReader(optimal))) {
        ...
    }catch (IOException e){
        e.printStackTracke();
    }
}

Damit wird das automatisch geschlossen. Und da ist auch nichts offen zu halten - das ist ja eine lokale Variable die außerhalb des Blockes nicht mehr existiert!
Achso, wenn ich einen catch habe, schließt es sich automatisch?
 
Achso, wenn ich einen catch habe, schließt es sich automatisch?
Bei try with resources: Ja. Aber bei einem einfachen try / catch Block passiert nichts, was da nicht explizit an Code steht. Da wäre also der korrekte Code (dem dieses try with resources auch entspricht):
Java:
public static String[] test(String optimal){
    BufferedReader nummerEins;
    try{
        nummerEins = new BufferedReader(new FileReader(optimal));
        ...
    }catch (IOException e){
        e.printStackTracke();
    } finally {
        try {
            if (nummerEins != null) nummerEins.close();
        } catch (Exception ex) {}
    }
}

Hier wird immer geschlossen - egal ob eine Exception auftritt oder nicht. Und wenn dabei eine Exception auftritt, dann wird diese ignoriert.
 
Beste Antwort
Bei try with resources: Ja. Aber bei einem einfachen try / catch Block passiert nichts, was da nicht explizit an Code steht. Da wäre also der korrekte Code (dem dieses try with resources auch entspricht):
Java:
public static String[] test(String optimal){
    BufferedReader nummerEins;
    try{
        nummerEins = new BufferedReader(new FileReader(optimal));
        ...
    }catch (IOException e){
        e.printStackTracke();
    } finally {
        try {
            if (nummerEins != null) nummerEins.close();
        } catch (Exception ex) {}
    }
}

Hier wird immer geschlossen - egal ob eine Exception auftritt oder nicht. Und wenn dabei eine Exception auftritt, dann wird diese ignoriert.
Noch eine kurze Frage, wie sieht das bei einem Writer aus? Wenn ich z. B. selber eine Datei im resource Ordner erstelle, dann muss ich immer closen oder? Zumindest ist bei mir dann nur die Datei da, aber da steht nichts, wenn ich beim writer nicht close.
 
Alles, was von AutoClosable erbst, solltest Du schließen. Das ist auch bei einem Writer der Fall. Und auch da in der Regel einfach mit einem Try with Resources - da ist sicher gestellt, dass dieser auch geschlossen wird.

Wenn du eine Instanzvariable hast, die AutoClosable ist, dann sollte die Klasse auch AutoClosable erben und damit die Methode close() anbieten, die dann die AutoClosable Variablen schließt.
 

Zurück
Oben