有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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


共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

    这种行为实际上是从FilterOutputStream继承来的。用于FilterOutputStream.close的Javadocs声明:

    The close method of FilterOutputStream calls its flush method, and then calls the close method of its underlying output stream.

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