当前位置: 首页 > 面试题库 >

我应该关闭servlet输出流吗?

钱振
2023-03-14
问题内容

我应该负责关闭HttpServletResponse.getOutputStream()(或getWriter()或什至inputstream),还是应该将其留给容器?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException {
    OutputStream o = response.getOutputStream();
    ... 
    o.close(); //yes/no ?
}

问题答案:

您确实不需要这样做。

经验法则:如果您没有使用自己创建/打开它newSomeOutputStream(),则不需要自己关闭它。例如newFileOutputStream("c:/foo.txt"),如果它是一个,那么您显然需要自己关闭它。

有些人仍然这样做的原因仅仅是为了确保不再将任何内容写入响应主体。如果发生这种情况,则将IllegalStateException在appserver日志中导致,但这不会影响客户端,因此客户端仍会获得正确的响应。这也是一种更容易的调试,可以发现请求-响应链中的潜在问题,这些乍看之下您不会看到。例如,其他一些东西正在将更多数据附加到响应主体,位于链的更下游。

在初学者中看到的另一个原因是,他们只是想防止更多数据写入响应主体。当JSP在响应中不正确地发挥作用时,您经常会看到这种情况。他们只是忽略IllegalStateException日志中的。不用说,这个特定的目的是有害的。



 类似资料:
  • 问题内容: 我使用a 将字符串转换为可以上传到SFTP服务器的文件(需要流)。事后结束这一点有什么意义吗?据我在源代码中看到的,它只是将字符串设置为… 我可以这样做,但是由于将close方法标记为throw,并且我只需要将其包装在try catch中,代码最终看起来比可能需要的可怕得多。 问题答案: 如果您知道要处理的是您将要扔掉的产品,那么我看不出有什么理由要关闭它。我无法想象关闭它后会保留对它

  • 我包一个插座。通过InputStreamReader获取getInputStream(),并包装一个套接字。getOutputStream()由OutputStreamWriter创建。我发现这些流的关闭顺序真的很重要,但我不知道为什么。 如果我先关闭outputStream,然后再关闭inputStream,它可以正常工作: 但是,如果我先关闭inputStream,然后再关闭outputStr

  • 问题内容: 我是否需要从HttpServletResponse“刷新”输出流? 我已经从看到了,应该关闭servlet输出流吗?我不需要关闭它,但是尚不清楚是否需要冲洗它。我也应该从容器中得到吗? 问题答案: 不用了 servletcontainer将为您刷新并关闭它。顺便说一句,关闭已经隐式调用了flush。 另请参阅Servlet 3.1规范的 5.6章: 关闭响应后,容器必须立即将响应缓冲区

  • 问题内容: Java中的InputStreams和OutputStreams是否在销毁时关闭()?我完全理解这可能是错误的形式(尤其是在C和C ++世界中),但是我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load()之后超出范围,并因此被破坏,就像C ++范围规则一样?我尝试在Google上搜索Java的匿名变量范围,但这并没有达到我的预期。 谢谢。 问题

  • 我需要发布一个JSON Camel Servlet,然后复制消息并拆分列表。处理每个拆分的消息,最后聚合并返回servlet响应。 然而,只要在路由中引入拆分器,我就会看到输入流正在关闭,Servlet无法写回响应。 请注意,流缓存也已启用。 例外: 如果我删除拆分器和聚合器,我会看到Servlet响应回来。 非常感谢您提供的所有帮助!。

  • 问题内容: 我在ORM上还很新。我刚刚开始阅读有关使用Hibernate的Java Persistence API的书籍和文档。 我只是想知道,关闭EntityManagerFactory与jdbc数据库连接关闭类似吗? 我们是否应该在每次持久/更新/删除后关闭它?如果我们不关闭它,数据库连接会保持打开状态吗? 问题答案: 我只是想知道,关闭与jdbc数据库连接关闭类似吗? 这并非完全正确,但关闭