是否有必要关闭从HttpServletRequest返回的输入流?

时间:2009-11-27 11:39:43

标签: java servlets

我有一些类似的生产代码:

HttpServletRequest httpServletRequest
...
DataInputStream dis = new DataInputStream(httpServletRequest.getInputStream())

这些流永远不会明确关闭。我在这里假设servlet容器管理它(JBOss Web)。处理这个问题的正确方法是什么?

4 个答案:

答案 0 :(得分:27)

I / O中的拇指规则是,如果您没有打开/创建输入流源您自己,那么您也不一定需要关闭它。这里只是包装请求的输入流,因此您不一定需要关闭它。

如果您确实打开了输入,例如: new FileInputStream("c:/file.ext")然后你显然需要在finally块中自己关闭它。容器应该在引擎盖下这样做。

答案 1 :(得分:9)

你绝对应该自己关闭这些流,这是容器的工作。手动操作可能会干扰请求生命周期,并且某些容器可能会对此进行剧烈反对。

答案 2 :(得分:3)

容器将处理此问题。 在分配它的同一个地方关闭资源总是很好的编码风格。(我在原帖中错了。我以为你打开了流。应该仔细阅读。)

答案 3 :(得分:0)

规范(最多3.0候选人)没有说(据我所知)。在没有规范信息的情况下,您可能会受到实施的支配。

参考实现的源代码在Sun Servlet page

中提到
  

参考实现包含在Java EE 5 SDK中,也包含在java.net上通过GlassFish项目提供的开源Java平台企业版(Java EE)应用程序服务器中。 Servlet技术的参考实现源代码可以从java.net上的svn存储库获得。有关GlassFish中所有webtier技术的更多信息,请访问GlassFish Webtier页面。

检查行为可能会接近确定的答案。