2016-07-08 24 views
3

Verwendung Wenn ein PrintWriter wie folgt aus:Was muss ich schließen, wenn Printwriter in Java

PrintWriter fileOut = new PrintWriter(new BufferedWriter(new FileWriter(csvFileIn))); 

Was benötige ich, blockieren in der schließlich schließen? Der PrintWriter, der BufferedWriter und der FileWriter?

Muss ich versuchen, die close-Anweisung im finally-Block abzufangen?

[EDIT] Ich brauche Java 6, so kann ich nicht die Try-with-Ressourcen-Anweisung verwenden.

Antwort

3

sollten Sie verwenden -

fileOut.close(); 

Wie Sie haben keine Variablennamen zugeordnet BufferedWriter oder FileWriter auch die fileOut von ihnen gemacht wird, wenn Sie fileOut schließen Sie es wiederum schließt sowohl die Ströme.

+0

Brauche ich einen Versuch, um diese Nähe zu fangen? – JavaDev

3

können Sie verwenden, um einen Try-with-Ressourcen Block

try (PrintWriter fileOut = new PrintWriter(new BufferedWriter(new  FileWriter(csvFileIn)))) { 
    //WHATEVER you need to do 
} 

Seit PrintWriter implementiert AutoCloseable es von selbst zu schließen, sobald die versuchen Block abgeschlossen ist (auch wenn eine Ausnahme ausgelöst wird)

Prüfen Sie mehr Infos dazu

0

Genau genommen sollten Sie alle drei Streams schließen. Und ich würde sogar eine vierte Ebene hinzufügen, da Sie wahrscheinlich nicht die CSV-Datei mit der Standard-Systemcodierung, sondern eine vom Kunden angegebene schreiben möchten. Das ist es also:

try (FileOutputStream fos = new FileOutputStream(csvFileIn); 
    FileWriter fwr = new FileWriter(fos, StandardEncodings.UTF_8); 
    BufferedWriter bwr = new BufferedWriter(fwr); 
    PrintWriter pwr = new PrintWriter(bwr)) { 
    pwr.println("Field1;Field2;Field3"); 
    pwr.println("Data1;Data2;Data3"); 
} 

In der Praxis, in der Regel nur der äußerste Strom geschlossen ist, da es (in der Regel) leitet den close() Aufruf an seinen gewickelten Strom, und erhalte ein OutOfMemoryError zwischen der Öffnen der Datei und dem Erreichen des try Blockes ist sehr unwahrscheinlich. Dann sieht es so aus:

try (PrintWriter pwr = new PrintWriter(new BufferedWriter(new FileWriter(new FileOutputStream(csvFileIn), StandardEncodings.UTF_8)))) { 
    pwr.println("Field1;Field2;Field3"); 
    pwr.println("Data1;Data2;Data3"); 
}