2010-07-28 17 views
3

如果我有一個servlet下面的代碼:FindBugs的「方法可能無法關閉流」使用的getResourceAsStream

Properties p = new Properties(); 
p.load(getClass().getResourceAsStream("/test.properties")); 

如果我運行通過FindBugs的servlet的,我希望得到警告OS_OPEN_STREAM,但我不。如果我使用類似的方法來打開文件系統上的(即不是在classpath中)一個任意文件,我得到FindBugs的警告如預期:

Properties p = new Properties(); 
p.load(new FileInputStream(new File("c:/test.properties"))); 

在第一個例子,就是警告缺席,因爲FindBugs的缺失一個有效的警告(也就是說,我應該在加載到Properties對象後關閉finally塊中的流)還是有一個原因,我不需要關閉流?

感謝

豐富

回答

7

看警告的描述:

的方法創建一個IO流 對象,不將其分配給任何 領域...

在你的第一個案例中,你的代碼不是create流,它要求類加載器給它一個流。因此,Findbugs不認爲你的代碼負責關閉流,可能是爲了避免誤報。

請注意,類加載器可以以不需要關閉流的方式實現getResourceAsStream()(即通過將資源複製到內存中並返回ByteArrayInputStream)。但是對於URLClassLoader從目錄加載類的常見情況,關閉流確實是避免泄露文件句柄所必需的。

+0

我相信這只是findbug部分的一個疏忽。關閉流。 – MeBigFatGuy 2010-07-29 21:06:28