2012-12-26 12 views
6

Mi chiedevo quale sia il modo migliore/appropriato per rilasciare risorse/handle di file.Rilascio corretto della risorsa I/O

codice tradizionale,

BufferredInputStream stream = null 
try{ 
    ---- 
    stream = new BufferredInputStream(new FileInputStream()); 
    ---- 
} finally{ 
    if(stream != null){ 
    stream.close() 
    } 

}

Intende la handle di file essere rilasciato chiudendo BufferredInputStream.close da solo o ha bisogno il sottostante stream(i.e. FileInputStream.close()) anche di essere chiamato in modo esplicito.

P.S. Javadoc for [FilterOutputStream.close] metodo specifica che chiuderà esplicitamente anche il flusso sottostante. Ma altri flussi non sembrano avere questo nel documento.

[FilterOutputStream.close]: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterOutputStream.html#close%28%29 

Si prega di consulenza. Grazie in anticipo.

+0

È possibile testarlo facilmente chiudendo solo l'oggetto BufferredInputStream e cercando di manipolare FileInputStream e vedere se viene sollevata un'eccezione di flusso chiuso. Credo che sarà chiuso come puoi vedere in molti esempi di documenti. Lo stream sottostante è creato in modo anonimo. – giorashc

+0

Solo un suggerimento: se stai usando JDK 7, usa il try-with-resources, è molto più semplice. Vedi [qui] (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). –

+0

Grazie per il suggerimento JavaNewbie_M107. Java 7 non è stato ancora aggiunto al progetto. Non vedo l'ora di farlo –

risposta

4

È sempre possibile controllare il codice sorgente della classe sottostante per determinare il comportamento esatto.

Tuttavia, in questo caso chiamando close() su BufferedInputStream si chiuderà anche il flusso sottostante, ovvero FileInputStream.

Il codice sorgente è disponibile here

2

Quando più flussi sono concatenati, il flusso che è stato creato per ultimo chiuderà il flusso sottostante. Quindi, chiudendo BufferedInputStream si chiuderà anche il sottostante FileInputStream.

Quindi si chiama close() su un flusso e si chiuderà automaticamente il flusso sottostante.

+0

Grazie per la risposta. Il javadoc non lo menziona. C'è qualche riferimento o prova per supportare questa risposta. Sto lavorando su un problema critico per fermare le perdite di handle di file. –

+0

Controlla il link nella risposta di Mr. Usman. Scorri fino in fondo e vedrai come funziona il metodo close(). Sta chiudendo l'InputStream che è stato incatenato a BufferdInputStream. –

0

BufferredInputStream stessa non detiene le risorse di sistema in modo BufferredInputStream.close() sarà semplice propagare la chiamata vicina ai InputStream che avvolge .. quindi dovrebbe fare bene.

Problemi correlati