关闭JAX-RS StreamingOutput的OutputStream

20

实现StreamingOutput接口的类是否应该关闭OutputStream

Java文档没有给出任何建议。我猜测它只是委托给底层的ServletOutputStream,这意味着它不应该被关闭,但我的猜测可能是错误的 :) 另外,Java文档提到了MessageBodyWriter接口,在那里明确指出输出流不能关闭。

https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/StreamingOutput.html


我认为你不应该关闭它。下游可能有过滤器或拦截器,如果你关闭输出流,可能会出现问题。 - sinujohn
1个回答

23

由于找不到确切的答案,我查看了jersey的源代码作为参考实现。在Jersey中,StreamingOutput通过调用streamingOutput.write(os)[1]被一个MessageBodyWriter处理,其中os是传递给MessageBodyWriterOutputStream。这很好,因为它的javadoc非常清楚,这个OutputStream不能被关闭。

总结一下:传递给StreamingOutputOutputStream不能被关闭。

[1] https://github.com/jersey/jersey/blob/master/core-common/src/main/java/org/glassfish/jersey/message/internal/StreamingOutputProvider.java


非常优秀并且非常有帮助的问答。很遗憾在interface StreamingOutput的Javadocs中缺少这份文档! - kevinarpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接