2013-08-05 8 views
5

La chiusura zos chiude automaticamente bos e fos oppure devo chiuderli manualmente?La chiusura di uno stream nidificato chiude anche i flussi principali?

+1

Devi anche fare attenzione a * sempre * chiudere il flusso più esterno; in caso contrario si potrebbero verificare perdite di dati dovute a buffer non scaricati nei flussi di wrapper che hanno chiuso il flusso avvolto sotto il loro naso. –

risposta

5

Sì, lo fa. La sua Javadoc dice:

Chiude il flusso di output ZIP, così come il flusso di essere filtrato.

Inoltre, il Javadoc for BufferedOutputStream dice:

chiude questo flusso di output e rilascia tutte le risorse di sistema associate al flusso.

Procedimento FilterOutputStreamclose chiama il suo metodo flush, e poi chiama il suo metodo di flusso di uscita sottostante close.

Quindi, quando si chiude il ZipOutputStream, si chiuderà il tuo BufferedOutputStream, che a sua volta chiudere il FileOutputStream.

2

La chiusura del flusso del wrapper chiude automaticamente il flusso interno.

Quindi, nel tuo caso, devi solo chiudere ZipOutputStream. Chiudere un flusso due volte non genera un'eccezione, quindi chiudere di nuovo un flusso interno (anche se non necessario) funziona altrettanto bene.

Ecco cosa succede quando si istanzia un ZipOutputStream

public ZipOutputStream(OutputStream out) { 
    this.out = out; // BufferedOutputStream reference saved 
} 

Ecco l'attuazione ZipOutputStream.close()

public void close() throws IOException { 
    try { 
     flush(); 
    } catch (IOException ignored) { 
    } 
    out.close(); // BufferedOutputStream being closed 
} 

Analogamente, BufferedOutputStream chiude automaticamente il FileOutputStream attraverso la sua ereditato FilterOutputStream#close() che è stato implementato come:

public void close() throws IOException { 
    try { 
     flush(); 
    } catch (IOException ignored) { 
    } 
    out.close(); // FileOutputStream being closed 
} 
0

Sì, sì. ma stranamente quando stavo eseguendo la scansione di fortificazione con find find abilitato cattura tutti questi tipi di stream avvolti e non chiusi come elementi ad alta priorità da correggere.Non sei sicuro del motivo per cui lo fanno

Problemi correlati