Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wann soll ich den Stream schließen, wenn ich das in einer Methode habe?
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?
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):
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.
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!
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):
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):
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.