Правильное высвобождение ресурса ввода-вывода


Мне было интересно, что является лучшим / подходящим способом освободить файловые ресурсы / дескрипторы.

Традиционный код,

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

}

Будет ли дескриптор файла освобожден путем закрытия BufferredInputStream.close самостоятельно или ему нужно, чтобы базовый stream(i.e. FileInputStream.close()) также был вызван явно.

P.S. Javadoc for [FilterOutputStream.close] метод указывает, что он также явно закроет базовый поток. Но другие потоки, похоже, не имеют этого в доке.

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

Пожалуйста, совет. Заранее спасибо.

4 6

4 ответа:

Вы всегда можете проверить исходный код базового класса, чтобы определить точное поведение.

Однако в этом случае вызов close() на BufferedInputStream также закроет основной поток, т. е. FileInputStream.

Исходный код доступен здесь

Ваш подход верен. Если вы сомневаетесь, всегда проверяйте исходный код. http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html Метод close закрывает "in", который был привязан к BufferedInputStream.

Когда несколько потоков соединены в цепочку, закрытие потока, который был построен последним, закроет основной поток. Таким образом, закрытие BufferedInputStream также закроет лежащий в основе FileInputStream.

Поэтому вы просто вызываете close () на одном потоке, и он автоматически закроет основной поток.

BufferredInputStream сам по себе не содержит никаких системных ресурсов, поэтому BufferredInputStream.close() просто распространит вызов close на InputStream, который он обертывает.. так что все должно быть в порядке.