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

问题描述:

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

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

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

是的,它关闭它。至于是否应该关闭它 - 您是否期望向响应流写入任何其他内容?如果不是,我认为关闭它是很好的。如果你不关闭它,你应该明显地冲洗它 - 但我怀疑你可以自己找出那一点:)

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

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

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

关闭BufferedOutputStream也会关闭底层的OutputStream。您应该关闭BufferedOutputStream,以便在关闭基础流之前刷新其内容。查看FilterOutputStream.close()的实现(BufferedOutputStream从哪个扩展中)来说服你自己。

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