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

Java 关闭BufferedOutputStream是否也会关闭底层OutputStream?,java,servlets,jakarta-ee,Java,Servlets,Jakarta Ee,我通过调用response.getOutputStream()将二进制数据(作为Clob从数据库中提取的CSV文件)流式传输到浏览器,并且在复制数据时通常将输出流包装在BufferedOutputStream中 我应该关闭BufferedOutputStream还是这也会关闭底层OutputStream [额外问题:在这种情况下,我是否需要使用BufferedOutputStream,或者响应是否已缓冲?]是的,它将关闭响应。至于是否应该关闭它,您是否希望在响应流中写入其他内容?如果没有,我认为

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

我应该关闭BufferedOutputStream还是这也会关闭底层OutputStream


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

是的,它将关闭响应。至于是否应该关闭它,您是否希望在响应流中写入其他内容?如果没有,我认为可以关闭它。如果你不关上它,你显然应该把它冲洗掉——但我怀疑你可以自己弄清楚:)

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

FilterOutputStream的关闭方法
调用其flush方法,然后调用
其底层的封闭方法
输出流


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

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

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