当前位置: 代码迷 >> Java Web开发 >> 关于response.getWriter()的关闭有关问题
  详细解决方案

关于response.getWriter()的关闭有关问题

热度:643   发布时间:2016-04-16 21:47:26.0
关于response.getWriter()的关闭问题
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletExceptionIOException {
//将请求、响应的编码均设置为UTF-8(防止中文乱码)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//调用核心业务类处理请求
String respMessage = CoreService.processRequest(request);

PrintWriter out = response.getWriter();
out.print(respMessage);

//释放资源
out.flush();
out.close();
out = null;
}

想请教最后三句out.flush();out.close();out = null;有什么作用,为什么要这么做,为什么看到有的资料里面写到servlet中最好不要用到flush,是不是只要out.close()这一句就够了,其他两句都不要?我只知道流用完了之后需要关闭,但是不知道如何正确的关闭,希望大神们能够详细的讲解一下,谢谢!
------解决思路----------------------
一般来说你看到有 close 的方法它会自动先 flush 一次再 close,明确的 flush 只是更保险,多数 API 都是会在 close 之前尝试 flush 的。

out = null; 这句只要不是在条件式无穷循环中,就不是必须的。如果一个后台线程运行  7 x 24 的功能,应该在循环中明确地把变量赋值为 null。
------解决思路----------------------
正确,明确地赋值在无穷式循环中是应该的,处理地不恰当当导致内存用光。比如下面这种:

while(var如果不停机一直运行) {
   MyBigObject c = new MyBigObject(); 
}

看起来这个变量是局部变量,但当如果这个对象占用内存较多时这个循环长时间运行会占用很多内存,可能导致 OutOfMemoberyError 。这个变量虽然声明在 while 循环中,但实际上它在当前方法内都一直存在的,只是仅在 while 循环内可见,只是可见性的差别。这个时候明确地赋值为 null 是应该的。


引用:
Quote: 引用:

一般来说你看到有 close 的方法它会自动先 flush 一次再 close,明确的 flush 只是更保险,多数 API 都是会在 close 之前尝试 flush 的。

out = null; 这句只要不是在条件式无穷循环中,就不是必须的。如果一个后台线程运行  7 x 24 的功能,应该在循环中明确地把变量赋值为 null。
哦哦,原来是这样子,它会自动先进行一次flush那我应该就不用flush了,刚查看了下close的源代码
/**
     * Close the stream.
     * @see #checkError()
     */
    public void close() {
try {
    synchronized (lock) {
if (out == null)
    return;
out.close();
out = null;
    }
}
catch (IOException x) {
    trouble = true;
}
    }
那这个out=null也应该不需要了,嗯!谢谢啊!
  相关解决方案