2009-09-15 2 views
11

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

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

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

ответ

12

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

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

близко метод FilterOutputStream вызывает его метод промывки, а затем вызывает тесную метод его основного выходного потока.

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

4

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

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

Смежные вопросы