Закрывает ли 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-заголовок длины содержимого.