2012-10-18 46 views
4

我想寫出具有以下基本形式的一些簡單的插座碼 -插座被試與資源封閉

try(BufferedReader request = new BufferedReader(new InputStreamReader(sock.getInputStream()))){ 
//Do some work... 
} 
//BufferedReader gets closed, but also makes the socket close 
... 
... 
response.write(blah);//Causes exception because socket is closed 

我的問題是,插座被關閉,但我不認爲它應該是。 try-with-resources創建一個BufferedReader,然後在我離開try塊時自動關閉它,但由於某種原因它也關閉了整個套接字!所以,當我在後來使用相同的套接字時得到我的響應代碼時,我得到一個異常。有沒有什麼辦法解決這一問題?或者我只是不得不使用試用資源(這將不太理想)?

回答

6

BufferedReader.close()關閉後備流。

解決的方式是一個「包裝」流不傳播的close()

+0

你碰巧知道什麼流不傳播關閉()? –

+2

在Java運行時無。您需要編寫自己的 –

+0

「BufferedReader.close()關閉支持流」...並關閉套接字的輸入或輸出流會關閉另一個流和套接字本身。 – EJP

1

代碼:

new BufferedReader(
    new InputStreamReader(
     sock.getInputStream())) 

包裹套接字流成包裹成一個BufferedReader閱讀器,但它是唯一的一個流。