PrintWriter java.io.IOException:已关闭

PrintWriter java.io.IOException:已关闭,java,servlets,Java,Servlets,在servlet类的doPost方法中执行此操作时,在PrintWriter上获取IOException: doPost(HttpServletRequest request, HttpServletResponse response){ String replyMessage = "STATUS_ACCEPT"; response.setStatus(HttpServletResponse.SC_OK); response.setContentType(

在servlet类的doPost方法中执行此操作时,在PrintWriter上获取IOException:

doPost(HttpServletRequest request,
        HttpServletResponse response){
    String replyMessage = "STATUS_ACCEPT";
    response.setStatus(HttpServletResponse.SC_OK);
    response.setContentType("text/plain; charset=utf-8");

    response.setContentLength(replyMessage.length());
    response.setIntHeader("content-length", replyMessage.length());
    response.getWriter().println(replyMessage);//getting IOException closed on calling this method
    response.flushBuffer();}
如果我使用outputstream发送数据,则没有错误:

    ServletOutputStream outputStream = response.getOutputStream();
    byte[] result = "STATUS_ACCEPT".getBytes("UTF-8");

    response.setStatus(HttpServletResponse.SC_OK);
    response.setContentType("text/plain; charset=utf-8");

    response.setContentLength(result.length);
    response.setIntHeader("content-length", result.length);

    outputStream.write(httpOutData);

如何使用printwriter不获取IOException?

最类似的原因是:

PrintWriter pw = response.getWriter();
pw.println("hello");     // flush is not required here....
response.setContentLength(replyMessage.length());
// ...
response.getWriter().println(replyMessage)
这意味着,您的响应内容至少比
setContentLength
所宣布的长度长一个字节:后面的换行符追加了
println()
。也许区别是两个字节:CR和LF

注意:如果您解决了这个问题,在一般情况下仍然会有问题:您将内容长度设置为字符数,而在UTF-8编码中,字符数并不总是字节数
setContentLength()
需要字节数


因此,最好简单地删除所有修改内容长度的代码,因为如果不设置它,它将自动计算。

最类似的原因是:

response.setContentLength(replyMessage.length());
// ...
response.getWriter().println(replyMessage)
这意味着,您的响应内容至少比
setContentLength
所宣布的长度长一个字节:后面的换行符追加了
println()
。也许区别是两个字节:CR和LF

注意:如果您解决了这个问题,在一般情况下仍然会有问题:您将内容长度设置为字符数,而在UTF-8编码中,字符数并不总是字节数
setContentLength()
需要字节数


因此,最好简单地删除所有修改内容长度的代码,因为如果不设置它,它将自动计算。

如果内容长度是自动计算的,我们应该在什么时候使用setContentLength()方法。根据Servlet容器的设置,长度可能会阻止缓冲Servlet容器中的大输出。如果自动计算内容长度,我们应该在何时使用setContentLength()方法。根据Servlet容器的设置,长度可能会阻止缓冲Servlet容器中的大输出。