2012-09-03 174 views
1

在Servlet類的doPost方法執行此操作時對PrintWriter的得到一個IOExcepiton:PrintWriter的產生java.io.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?

回答

4

最喜歡的理由是這樣的:

response.setContentLength(replyMessage.length()); 
// ... 
response.getWriter().println(replyMessage) 

這意味着,你的迴應內容至少一個字節的時間長於setContentLenght宣佈:由println()附加的換行符。也許差異是兩個字節:CR和LF。

注意:如果你解決這個問題,你仍然會在一般情況下問題:您設置的內容長度的字符數這在UTF-8編碼並不總是字節數。 setContentLength()想要的字節數。

因此,最好簡單地刪除所有內容長度的代碼,因爲如果不設置它,它會自動計算。

+0

如果內容長度是自動計算的,我們應該什麼時候使用setContentLength()方法。 – vjk

+2

根據Servlet容器的設置,_may_的長度會阻止Servlet容器中的緩衝_large_輸出。 –

1
PrintWriter pw = response.getWriter(); 
pw.println("hello");  // flush is not required here.... 
相關問題