Правильное высвобождение ресурса ввода-вывода
Мне было интересно, что является лучшим / подходящим способом освободить файловые ресурсы / дескрипторы.
Традиционный код,
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 ответа:
Вы всегда можете проверить исходный код базового класса, чтобы определить точное поведение.
Однако в этом случае вызов
close()
наBufferedInputStream
также закроет основной поток, т. е.FileInputStream
.Исходный код доступен здесь
Ваш подход верен. Если вы сомневаетесь, всегда проверяйте исходный код. http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html Метод close закрывает "in", который был привязан к BufferedInputStream.
Когда несколько потоков соединены в цепочку, закрытие потока, который был построен последним, закроет основной поток. Таким образом, закрытие
BufferedInputStream
также закроет лежащий в основеFileInputStream
.Поэтому вы просто вызываете close () на одном потоке, и он автоматически закроет основной поток.