2013-05-16 13 views

Antwort

12

Es ist nicht notwendig, es zu schließen, da sich BufferedWriter darum kümmert, den Writer zu schließen, den es umschließt.

Sie zu überzeugen, das ist der Quellcode der Nähe Methode von BufferedWriter:

public void close() throws IOException { 
    synchronized (lock) { 
     if (out == null) { 
      return; 
     } 
     try { 
      flushBuffer(); 
     } finally { 
      out.close(); 
      out = null; 
      cb = null; 
     } 
    } 
} 
+5

[Die Zeile 'out.close(); 'fehlt] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25 /java/io/BufferedWriter.java?av=f#259) in der Java 8 'BufferedWriter' – Mihai

+5

@ A.Roshenko genau hinschauen, der' try' Block wurde durch 'try-with' Block in Java 8 BufferedReader ersetzt. Also, das gleiche, der zugrunde liegende Autor wird immer noch in Java 8 geschlossen. –

2

Ja writer.close() schließt auch zugrunde liegende Writer/Streams.

2

Es ist besser, jeden offenen Stream einzeln zu schließen, wie alle separater Strom sind. Wenn ein Fehler im verschachtelten Stream auftritt, wird der Stream nicht geschlossen. So ist es besser, jeden verschachtelten Stream exklusiv zu schließen.

Für weitere Details siehe folgenden Link:

Correct way to close nested streams and writers in Java

+0

Danke für die Verknüpfung in dieser Frage. Aber ich stimme nicht zu, dass es besser ist, die inneren Schreiber auch zu schließen, weil: 1) die finally-Klausel (wie Sie in meiner Antwort sehen) garantiert, dass die enge Methode des inneren Schreibers genannt wird 2) Im (seltenen) Fall dass out.close() kann eine Exception auslösen, die Membervariablen des Writers out und cb werden nicht auf null gesetzt, was kein Problem ist, da es sich um einfache Objekte handelt (keine Systemressourcen, wie zB ein Datei-Handle) – sambe

1

Sie müssen nur die äußerste Strom schließen. Der Rest der Streams ist temporär und wird automatisch geschlossen. Wenn Sie die Streams getrennt erstellen und dann verschachteln, müssen Sie in diesem Fall den einzelnen Stream schließen. Überprüfen Sie diese Frage auch Correct way to close nested streams and writers in Java

+0

Nein, das tust du nicht "muss den einzelnen Stream [s] schließen". Sie müssen nur den äußersten Stream schließen. – EJP