关闭BufferedOutputStream是否也会关闭底层的OutputStream?

时间:2009-09-15 16:08:21

标签: java servlets java-ee

我通过调用response.getOutputStream()将二进制数据(从数据库中提取的CSV文件作为Clob)传输到浏览器,并且通常在复制数据时将OutputStream包装在BufferedOutputStream中。

我应该关闭BufferedOutputStream还是关闭底层的OutputStream?

[额外问题:在这种情况下我是否需要使用BufferedOutputStream或响应是否已缓冲?]

2 个答案:

答案 0 :(得分:12)

是的,关闭它。至于你是否应该关闭它 - 你是否希望在响应流中写入其他内容?如果没有,我认为关闭它是好的。如果你不关闭它,你应该显然应该冲洗它 - 但我怀疑你可以为自己找出这一点:)

该行为实际上是从FilterOutputStream继承的。 FilterOutputStream.close状态的Javadocs:

  

FilterOutputStream的密切方法   调用它的flush方法,然后调用   其底层的密切方法   输出流。

至于你是否应该缓冲它 - 我不确定这是否定义明确。它可能隐藏在某个地方的servlet规范中 - 它甚至可以配置(有时你真的不想缓冲,但如果你可以缓冲整个响应,这意味着你可以提供一个更好的错误页面,如果你出错后出错)我开始写作。)

答案 1 :(得分:4)

关闭BufferedOutputStream也将关闭底层的OutputStream。您应该关闭BufferedOutputStream,以便在关闭基础流之前刷新其内容。请参阅FilterOutputStream.close()的实现(BufferedOutputStream从中扩展)以说服自己。

我想是否给你的servlet提供的响应流是否被缓冲取决于你的Servlet容器的实现。 FWIW我知道默认情况下Tomcat确实缓冲了它的servlet响应流,以便尝试设置内容长度的HTTP头。