2013-05-16 15 views

risposta

12

Non è necessario chiuderlo, perché BufferedWriter si occupa di chiudere il writer che lo include.

Per convincervi, questo è il codice sorgente del metodo close BufferedWriter:

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

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

+5

@ A.Roshenko guardano da vicino, il blocco' try' è stato sostituito con il blocco 'try-with' in java 8 BufferedReader. Quindi, la stessa cosa, lo scrittore sottostante è ancora chiuso in java 8. –

2

writer.close() chiude anche scrittori/flussi sottostanti.

2

E 'meglio chiudere ogni flusso aperto singolarmente come tutti sono flusso separato. Se ci sono degli errori nello stream annidato, lo stream non si chiude. Quindi è meglio chiudere esclusivamente ogni flusso annidato.

Per maggiori dettagli fare riferimento seguente link:

Correct way to close nested streams and writers in Java

+0

Grazie per il collegamento a questa domanda. Ma non sono d'accordo che sia meglio chiudere anche gli scrittori interiori, perché: 1) la clausola finale (come vedi nella mia risposta) garantisce che il metodo di chiusura dello scrittore interno è chiamato 2) Nel (raro) caso che out.close() potrebbe lanciare un'eccezione, le variabili membro del writer out e cb non sono impostate su null, il che non è un problema perché sono oggetti semplici (non risorse di sistema, come ad esempio un handle di file) – sambe

1

È necessario chiudere solo i flussi più esterni. il resto dei flussi è temporaneo e verrà chiuso automaticamente. se si creano gli stream separatamente e poi li si annidano, in tal caso è necessario chiudere il singolo flusso. Controlla anche questa domanda Correct way to close nested streams and writers in Java

+0

No, non lo fai 'necessario chiudere il flusso individuale [s]'. Hai solo bisogno di chiudere il flusso più esterno. – EJP

Problemi correlati