【问题标题】:Can I close wrapper inputstream or outputstream class in servlet?我可以在 servlet 中关闭包装器输入流或输出流类吗?
【发布时间】:2014-07-26 00:05:32
【问题描述】:

我有一个类似...的代码

class DemoServlet extends HttpServlet
 {    
  doPost(HttpReqeust httpRequest,HttpResponse httpResponse)
       {
           try {
               ObjectInputStream input=new ObjectInputStream(httpRequest.getInputStream());
               Object ojb=input.readObject();
               ObjectOutputStream output=new ObjectOutputStream(httpResponse.getOutputStream());
               }
           catch(Exception ex){
                  ex.printStackTrace();
              }
           finally{
               input.close();  // it is necessary to close or it will handle by the servlet container to
               output.close(); // the outputstream or inputstream.
           }
      }}

我知道关闭 httpRequest.getInputStream() 和 httpResponse.getOutputStream() 不是必需的,但是关闭包装输入流和输出流的 Stream 类是否正确。它们会产生问题还是抛出异常。

【问题讨论】:

  • 查看 try with resources 模式。你可能会泄漏流,那里。捕获所有异常通常是不好的做法。

标签: java servlets inputstream outputstream


【解决方案1】:

Java SE 中的包装器流/读取器/写入器关闭底层流(当它们关闭时),因此如果您想保持它们打开,请不要关闭包装器。

编辑: Readerclose() 文档可能解释得更好。包装器(如InputStreamReader)通常为接口扩展此类而不覆盖文档。

ObjectOutputStream 的情况类似,您可以检查source 中的行为。

【讨论】:

  • 你能用一些例子来详细说明你的答案吗?所以,我可以正确理解它并提前感谢。
  • @Sahil 添加了一些示例,希望对您有所帮助。
  • 这意味着总体结论是,如果我关闭 ObjectInputStream 或 ObjectOutputStream 那么我的 httpRequest.getInputStream() 或 httpResponse.getOutputStream() 也分别关闭。所以,你想说最好保持它们打开,然后它会被容器自动关闭。我说的对吗?
  • @Sahil 是的,当然,如果您关闭 ObjectInputStream,您将关闭 httpRequest.getInputStream()。它是同一个对象。如果您将它们打开,容器将关闭它。如果您没有将在 Servlet 调用后执行的过滤器,则应该关闭它。
【解决方案2】:

让我们从The Java EE 5 Tutorial - Filtering Requests and Responses 开始,这里将详细解释如何使用HttpServletResponseWrapperHttpServletRequestWrapper 自定义请求和响应的示例

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 2011-12-09
    • 2012-11-17
    • 2021-03-09
    • 2015-06-18
    • 1970-01-01
    • 2011-06-29
    • 2013-06-06
    相关资源
    最近更新 更多