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

2022-09-04 02:20:31

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

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

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


答案 1

是的,它关闭了它。至于你是否应该关闭它 - 你是否期望向响应流写入其他任何内容?如果没有,我认为关闭它是可以的。如果你不关闭它,你显然应该冲洗它 - 但我怀疑你可以自己弄清楚这一点:)

该行为实际上是从 继承的。Javadocs for state:FilterOutputStreamFilterOutputStream.close

close 方法调用其 flush 方法,然后调用其基础输出流的 close 方法。FilterOutputStream

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


答案 2

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

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


推荐