2010-04-03 68 views
3

在我的Java代碼,我開始一個新的進程,然後獲取它的輸入流中讀取數據:FindBugs:「可能無法關閉流」 - 這是有效的情況下的InputStream?

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 

FindBugs的報告此錯誤:

may fail to close stream 
Pattern id: OS_OPEN_STREAM, type: OS, category: BAD_PRACTICE 

我必須關閉另一個進程的InputStream ?而且,根據its Javadoc,InputStream#close()什麼也不做。那麼這是一種誤報,還是應該在完成後真正關閉流程的輸入流?

回答

4

在這種情況下,你想close()Reader,這將關閉其基礎流。是的,關閉數據流總是一個很好的做法,即使在你知道你正在查看的實現沒有做任何事情的時候(儘管實際上它在這裏)。如果以後改變了會怎樣?

FindBugs只是在那裏警告可能的錯誤;它不能總是知道。

最後是的,你的Java進程擁有你產生的進程和Process對象。你絕對需要關閉它和輸出流。沒有其他人在使用它們,而且做這樣的事情很重要,以避免操作系統相關的流有趣的業務。

+0

好的,另一個依靠實施失敗......我現在就按照你的建議關閉閱讀器。 – thSoft 2010-04-03 11:16:56

3

InputStream是一個抽象類 - 只是因爲它實施什麼也不做,並不意味着通過process.getInputStream()返回對象的實際類型沒有。

在這種特殊情況下未能關閉輸入流可能沒有任何危害 - 但我個人不會指望它。關閉它就像關閉任何其他輸入流一樣。除了其他任何東西,這會讓你的代碼更健壯,以防你決定改變它來讀取其他東西 - 這會很容易(比如說)從文件中讀取,而不會注意到你沒有關閉FileInputStream

+0

什麼樣的失敗並不意識到它是抽象的 - 我對此感到羞恥...... 好的,我會關閉它。讓我感到困惑的是,這不是我明確開放的流。 – thSoft 2010-04-03 10:06:10

0

我認爲它總是一個很好的習慣來關閉你打開的所有流。最好在finally {}塊中。由於它沒有像java所說的那樣做,所以爲什麼不調用close()方法。它沒有傷害。

相關問題