在servlet类的doPost方法中执行此操作时在PrintWriter上获取IOExcepiton:
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();}
如果我使用输出流发送数据,则没有错误:
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呢?
答案 0 :(得分:4)
最喜欢的原因是:
response.setContentLength(replyMessage.length());
// ...
response.getWriter().println(replyMessage)
这意味着,您的响应内容至少比setContentLenght
宣布的字节长一个字节:println()
附加的尾随换行符。也许差别是两个字节:CR和LF。
注意:如果您修复此问题,在一般情况下仍然会遇到问题:您将内容长度设置为字符数,其中UTF-8编码并不总是字节。 setContentLength()
想要字节数。
因此,最好简单地删除所有摆放内容长度的代码,因为如果你没有设置它,它将自动计算。
答案 1 :(得分:1)
PrintWriter pw = response.getWriter();
pw.println("hello"); // flush is not required here....