我应该关闭Servlet的OutputStream吗?

61
2个回答

83

实际上,你不需要这样做。

规则是:如果你没有使用new SomeOutputStream()创建/打开它自己,则不需要手动关闭。例如,如果是new FileOutputStream("c:/foo.txt"),那么你就需要手动关闭。

一些人仍然这样做的原因仅仅是为了确保不会写入响应正文更多的内容。如果发生这种情况,它将在应用服务器日志中引起IllegalStateException,但这不会影响客户端,所以客户端仍然可以得到正确的响应。这也是更容易调试请求-响应链中潜在问题的方法,否则你一眼看不到其中可能存在的问题。例如,在链中的某个地方,其他内容正在追加更多数据到响应正文中。

另一个新手常犯的错误就是他们想要防止向响应正文中再写入更多的数据。当JSP不正确地在响应中起作用时,你经常会看到这种情况。他们只是忽略日志中的IllegalStateException。不需要说,这种特定目的是有问题的。


1
如果您已经打开了另一个InputStream来包装它,那么您可能希望关闭该流,因为容器将无法看到包装流,其中可能包含未提交的字节。理想情况下,如果它是像BufferedOutputStream这样的流,您只需flush()包装流即可,但是我发现在使用CipherOutputStream时,该类不会完全写入数据(我认为在这种情况下有充分的理由)。在这种情况下,必须调用close()才能使客户端获得正确的响应。 - David Carboni

10

不需要关闭它。如果你这样做,基本上就结束了向客户端的响应。在关闭流之后,直到下一个请求到来之前,你无法向客户端发送任何内容。你没有打开该流,因此也不必关闭。


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