Закрывает ли BufferedOutputStream также базовый OutputStream?
Я передаю двоичные данные (файл CSV, извлеченный из базы данных как Clob) в браузер, вызывая response.getOutputStream() и обычно обертывает OutputStream в BufferedOutputStream при копировании данных.
Должен ли я закрыть BufferedOutputStream или это также закроет базовый OutputStream?
[Дополнительный вопрос: нужно ли использовать BufferedOutputStream в этом случае или уже буферизуется ответ?]
Ответы
Ответ 1
Да, он закрывает его. Что касается того, следует ли его закрыть, ожидаете ли вы написать что-нибудь еще в потоке ответов? Если нет, я думаю, что это хорошо, чтобы закрыть его. Если вы не закрываете его, вы должны, очевидно, очистить его, но я подозреваю, что вы могли бы понять, что это вышло из себя:)
Поведение фактически унаследовано от FilterOutputStream
. Состояние Javadocs for для FilterOutputStream.close
:
Метод закрытия FilterOutputStream
вызывает метод flush, а затем вызывает близкий метод его выходной поток.
Что касается необходимости буферизации, я не уверен, что это хорошо определено. Он может быть похоронен в спецификации сервлета где-то - и он может даже быть настраиваемым (иногда вы действительно не хотите буферизации, но если вы можете буферировать весь ответ, это означает, что вы можете обслуживать более приятную страницу с ошибкой, если что-то пойдет не так, вы начали писать).
Ответ 2
Закрытие BufferedOutputStream также закроет базовый OutputStream. Вы должны закрыть BufferedOutputStream, чтобы он очищал его содержимое перед закрытием базового потока. См. Реализацию FilterOutputStream.close() (из которого продолжается BufferedOutputStream), чтобы убедить себя.
Я предполагаю, что независимо от того, будет ли поток ответа, переданный вашему сервлету, буферизованным или нет, зависит от реализации вашего контейнера сервлетов. FWIW Я знаю, что Tomcat действительно буферизует потоки ответа сервлета по умолчанию, чтобы попытаться установить HTTP-заголовок длины содержимого.