2014-06-23 8 views
17
InputStream in = SomeClass.getInputStream(...); 
BufferedInputStream bis = new BufferedInputStream(in); 

try { 
    // read data from bis 
} finally { 
    bis.close(); 
    in.close();  
} 

Die javadoc für BufferedInputStream.close() nicht erwähnt, ob der zugrunde liegenden Stream geschlossen ist:Wenn ich einen BufferedInputStream schließe, wird auch der zugrunde liegende InputStream geschlossen?

Schließt diesen Eingangsstrom und gibt alle Systemressourcen mit dem Strom verbunden. Sobald der Stream geschlossen wurde, wird durch weitere Aufrufe von read(), available(), reset() oder skip() eine IOException ausgelöst. Das Schließen eines zuvor geschlossenen Datenstroms hat keine Auswirkungen.

Ist der explizite Aufruf in.close() notwendig, oder sollte es durch den Aufruf zu bis.close() geschlossen werden?

+0

Kurze Antwort: Ja. Lange Antwort: Yeeeeesssss. Im Ernst, siehe http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html#472 – Marco13

+2

möglich Duplikat von [Closing inputstreams in Java] (http://stackoverflow.com/questions/ 11263926/closing-inputstreams-in-java) –

Antwort

21

Aus dem Quellcode BufferedInputStream geschlossen:

public void close() throws IOException { 
    byte[] buffer; 
    while ((buffer = buf) != null) { 
     if (bufUpdater.compareAndSet(this, buffer, null)) { 
      InputStream input = in; 
      in = null; 
      if (input != null) 
       input.close(); 
      return; 
     } 
     // Else retry in case a new buf was CASed in fill() 
    } 
} 

So wäre die Antwort: JA

4

Wenn Sie einen BufferedInputStream schließen, wird der zugrunde liegende InputStream tatsächlich ebenfalls geschlossen. :)

+0

Können Sie eine Referenz angeben? –

+0

@GrahamBorland können Sie einfach den Quellcode von Java schauen –

+0

Auch das wäre meine Lesung von "gibt alle Systemressourcen mit dem Stream verbunden". Aber ja, sie könnten expliziter sein. – Thilo

2

Ja. Der zugrunde liegende Stream wird geschlossen. Hier

2

ist die Java-Implementierung

/** 
* Closes this input stream and releases any system resources 
* associated with the stream. 
* Once the stream has been closed, further read(), available(), reset(), 
* or skip() invocations will throw an IOException. 
* Closing a previously closed stream has no effect. 
* 
* @exception IOException if an I/O error occurs. 
*/ 
public void close() throws IOException { 
    byte[] buffer; 
    while ((buffer = buf) != null) { 
     if (bufUpdater.compareAndSet(this, buffer, null)) { 
      InputStream input = in; 
      in = null; 
      if (input != null) 
       input.close(); 
      return; 
     } 
     // Else retry in case a new buf was CASed in fill() 
    } 
} 

So wird der Strom

4

BufferedInputStream dosent halten alle Systemressourcen selbst, es einfach umschließt einen InputStream, der diese Ressourcen enthält. Dies bedeutet, dass BufferedInputStream sein self nichts zu schließen hat, also leitet die close-Operation an den umhüllten InputStream weiter, der dann seine Ressourcen freigibt.