1. 程式人生 > >java.io.IOException:stream closed 異常的原因及處理

java.io.IOException:stream closed 異常的原因及處理

java.io.IOException: Stream closed

嚴重: Servlet.service() for servlet jsp threw exception。出現此錯誤一般都是在jsp中使用了輸出流,沒有妥善處理好的原因。
原因:
在tomcat中jsp編譯成servlet之後在函式_jspService(HttpServletRequest request, HttpServletResponse response)的最後
有一段這樣的程式碼
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
這裡是在釋放在jsp中使用的物件,會呼叫response.getWriter(),因為這個方法是和
response.getOutputStream()相沖突的!所以會出現以上這個異常。

解決的辦法
在使用完輸出流以後呼叫以下兩行程式碼即可:
out.clear();
out = pageContext.pushBody();

java.io.IOException: Stream closed出現這個異常的原因:舉個例子

BufferedReader Input1 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader Input2 = new BufferedReader(new InputStreamReader(System.in));

這兩句話中的Input1和Input2都是由System.in封裝而來。這是設計模式中的裝飾模式的應用,顧名思義,裝飾模式就是對最原始的東西進行裝飾,只改變了外表,但實質並沒有改變。System.in就是最原始的東西,Input1和Input2只是他被裝飾後的外表,所以程式中的Input1和Input2的實質上都是System.in。呼叫Input1.close(),會自動呼叫Input1的實質System.in.close(),所以對於Input2來說他的實質System.in已經關閉掉,所以...

 

多個執行緒索引同一個input  stream,當某一個thread在執行完之後,把這個inputstream關閉了;而此時正在從這個input  stream流中讀取資訊的執行緒就會丟擲  java.io.IOException:  Stream  closed  異常。

    終於找到這個異常的根源所在,原來是兩個頁面同時呼叫一個jsp,這個jsp中的內建物件
out在執行out.close()時發生的異常,也就是當某一個thread(對應一個jsp)在執行完之
後,把這個stream關閉了;而此時正在從這個stream中讀取資訊的另一個jsp就會丟擲  

java.io.IOException: 

Stream closed 異常。 

FileWriter filewriter=new FileWriter(file);

BufferedWriter bufferedwriter=new BufferedWriter(filewriter);

bufferedWriter依賴於fileWriter. 關閉流的時候, 要先關閉bufferedWriter, 再關閉fileWriter.

否則在BufferedWriter的close裡再次
試圖關閉一個已經關閉的流就java.io.IOException: Stream closed了。