Закрытие BufferedOutputStream также закрывает основной OutputStream? - PullRequest
12 голосов
/ 15 сентября 2009

Я передаю двоичные данные (CSV-файл, извлеченный из базы данных в виде Clob) в браузер, вызывая response.getOutputStream () и обычно при переносе данных оборачивает OutputStream в BufferedOutputStream.

Должен ли я закрыть BufferedOutputStream или это также закроет базовый OutputStream?

[Дополнительный вопрос: нужно ли в этом случае использовать BufferedOutputStream или ответ уже буферизован?]

Ответы [ 2 ]

12 голосов
/ 15 сентября 2009

Да, это закрывает. Что касается того, следует ли вам его закрыть - ожидаете ли вы что-нибудь еще написать в поток ответов? Если нет, я думаю, что это нормально, чтобы закрыть его. Если вы не закроете его, то, очевидно, вместо этого вы должны очистить его - но я подозреваю, что вы сами можете это понять:)

Поведение фактически унаследовано от FilterOutputStream. Javadocs для для FilterOutputStream.close состояния:

Метод закрытия FilterOutputStream вызывает его метод сброса, а затем вызывает близкий метод его лежащего в основе выходной поток.

Что касается того, следует ли вам буферизовать это - я не уверен, что это хорошо определено. Он может быть где-то спрятан в спецификации сервлета - и даже может быть настраиваемым (иногда вы действительно не хотите буферизовать, но если вы можете буферизовать весь ответ, это означает, что вы можете предоставить более хорошую страницу ошибок, если после вас что-то пойдет не так » мы начали писать).

4 голосов
/ 15 сентября 2009

Закрытие BufferedOutputStream также закроет базовый OutputStream. Вы должны закрыть BufferedOutputStream, чтобы он сбрасывал свое содержимое перед закрытием основного потока. См. Реализацию FilterOutputStream.close () (из которой расширяется BufferedOutputStream), чтобы убедить себя.

Полагаю, что буферизация потока ответов, переданного вашему сервлету, зависит от реализации вашего контейнера сервлетов. Я знаю, что Tomcat по умолчанию буферизует свои потоки ответов сервлета, чтобы попытаться установить HTTP-заголовок длины содержимого.

...