java关闭BufferedOutputStream是否也会关闭底层OutputStream?
我通过调用response将二进制数据(作为Clob从数据库中提取的CSV文件)流式传输到浏览器。getOutputStream(),并在复制数据时通常将OutputStream包装在BufferedOutputStream中
我应该关闭BufferedOutputStream还是这也会关闭底层OutputStream
[额外问题:在这种情况下,我需要使用BufferedOutputStream还是响应已经缓冲?]
# 1 楼答案
关闭BufferedOutputStream也将关闭底层OutputStream。您应该关闭BufferedOutputStream,以便它在关闭底层流之前刷新其内容。请参阅FilterOutputStream的实现。close()(BufferedOutputStream从中扩展)说服自己
我想,给servlet的响应流是否被缓冲取决于servlet容器的实现。FWIW我知道Tomcat在默认情况下会缓冲其servlet响应流,以便尝试设置内容长度HTTP头
# 2 楼答案
是的,它关闭了它。至于是否应该关闭它,您是否希望在响应流中写入其他内容?如果没有,我认为可以关闭它。如果你不关上它,你显然应该把它冲洗掉——但我怀疑你可以自己弄清楚:)
这种行为实际上是从
FilterOutputStream
继承来的。用于FilterOutputStream.close
的Javadocs声明:至于你是否应该缓冲它——我不确定这是否定义明确。它可能隐藏在servlet规范的某个地方,甚至可能是可配置的(有时你真的不需要缓冲,但如果你能缓冲整个响应,这意味着如果你开始编写之后出现问题,你可以提供更好的错误页面)