2014-01-16 46 views
3

我對計算器的第一個問題,我退出;)閉幕流連鎖與嘗試,與資源

當使用流鏈它通常是良好的初步實踐,只是關閉了最後一個流鏈中,由於關閉( )操作應該通過鏈的所有流傳播。

將try-with-ressource語句和流鏈接結合起來會被認爲是好的做法嗎?

一)創建try語句裏面的所有數據流:

try (InputStream processIn = p.getInputStream(); 
      InputStreamReader inReader = new InputStreamReader(processIn); 
      BufferedReader input = new BufferedReader(inReader)) { 
    . 
    . 
} 

或B)只是鏈條的最後一個成員:

InputStream processIn = p.getInputStream(); 
InputStreamReader inReader = new InputStreamReader(processIn); 
try (BufferedReader input = new BufferedReader(inReader)) { 
    . 
    . 
} 

我想這兩個版本將工作進行到底,但我假設a)會產生重複的close()調用,不是嗎?

回答

3

好的做法是選項a)。

如果您使用選項b),那麼如果流inReader的初始化失敗,則流processIn將不會關閉。

另一方面,如果您使用選項a),那麼每個流都將被正確關閉。當然,如果你鏈接流,那麼鏈中的第一個流可能試圖關閉多次,但這對於流是可以的,因爲它們都實現了Closeable,這要求方法close()是冪等的(即如果流已經關閉,則額外的調用close()應該沒有效果)。

你可以找到更多的信息herehere

+0

我沒有考慮可能的初始化問題。每個人閱讀這篇文章也應該閱讀你描述類似問題的第二個鏈接。 這兩種情況在您考慮時都很明顯,但很容易被忽視。 感謝提示! – Johnson