我有一些类似的生产代码:
HttpServletRequest httpServletRequest
...
DataInputStream dis = new DataInputStream(httpServletRequest.getInputStream())
这些流永远不会明确关闭。我在这里假设servlet容器管理它(JBOss Web)。处理这个问题的正确方法是什么?
答案 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页面。
检查行为可能会接近确定的答案。