2011-02-23 133 views
20

我作爲Test Automation的培訓生工作。 我正在使用Eclipse創建Junit代碼並使用Eclipse運行。 因爲我正在使用FileInputStream函數從excel工作表中重新獲取數據。我必須關閉FileInputStream嗎?

FileInputStream fi=new FileInputStream("c:\\search.xls"); 
Workbook w=Workbook.getWorkbook(fi); 
Sheet s=w.getSheet(0); 

是否需要關閉Inputstream函數?如果是這樣,請用一些編碼指導我。

回答

7
FileInputStream fi=null; 
try { 
    fi=new FileInputStream("c:\\search.xls"); 
    Workbook w=Workbook.getWorkbook(fi); 
    Sheet s=w.getSheet(0); 
} finally { 
    if (fi!=null) { 
     fi.close(); 
    } 
} 
+4

只是一個小小的評論 - 你還需要使用try/catch來包裝'close()'語句,因爲'close()'聲明拋出一個檢查到的IOException。事實上,你不能像這樣終於使用。您只能嘗試/終於遇到運行時異常。但是像IOException和它的子類這樣的檢查異常,你必須有try/catch或者try/catch/finally ......它不會僅僅通過try/finally來編譯。 – 2011-02-23 13:23:55

+2

取決於是否爲該方法聲明IOException。如果你抓住它,你應該知道該怎麼做。最重要的部分是將close()放在finally塊中。事實上,自動處理這是我真的很期待在Java 7中看到的功能之一。 – Axel 2011-02-23 14:00:09

6

您可能需要關閉()或結束您的程序。

然而,你可以遇到困惑的問題,如果你不關閉該文件作爲

  • 有時測試單獨運行或一組測試都是在同一個進程中運行。 (因此,您可以進行一種測試,但不能測試其他測試)
  • 您無法重命名或刪除打開的文件。

最好的做法是始終關閉您已完成的資源,但我將單元測試視爲並非總是遵循最佳實踐的腳本。

-1

Basic CompSci 101告訴我們確保關閉我們以Java或任何語言打開的資源。所以是的,你需要關閉它們。當你不這樣做的時候,壞的juju肯定會發生。

此外,你應該學習(並有傾向)使用Javadocs。查看FileInputStream的Javadoc並關閉。答案就在那裏。

+2

在沒有批評和理解* why?*部分的情況下盲目遵循既定規則是非常糟糕的做法。 *不好的事情會發生* - 哦共同?!編程不是一個巫術魔術,沒有提到後果(**文件不能移動,一般來說,可能會引入內存泄漏,[文件句柄的池可能是exausted](https://stackoverflow.com/questions/) 1661322 /太多打開文件句柄)**)沒有正確釋放資源,你的答案是無用的,而且有害的。 ** Downvoted。** – 2014-02-11 14:43:43

+1

Oooo,我用一種語言形式,你走「他相信巫術的ZOMG」(而不是「呃,他沒有拼出來,選擇了一些白話。」)還有一些其他答案沒有說明後果,除非你出去否定它們,否則你只是在一匹偏倚的高馬上攀爬一堆肥皂盒。爲什麼我不拼寫這些問題(以及爲什麼大多數在這個線程中的人沒有)?因爲他們很容易找到適當的文獻,任何人都可以做一個小小的研究。 – 2014-02-11 17:15:32

5

它總是一個好主意,關閉您使用的資源,

如果使用資源在資源A,這是明智的,收,而不是一個如果有一個方法。

在你的情況,你使用WorkbookFileInputStream,所以你最好關閉Workbook,依靠Workbok它將關閉FileInputStream

在這種特殊情況下,實際上,Workbookwill closeFileInputStreamgetWorkbook()方法的結束,但它仍然是一個好主意,closeWorkbook能夠進行垃圾回收。

3

是的!你應該總是在完成它們之後釋放一次資源。 Java有一個強大的垃圾收集機制(請注意,它與資源管理/泄漏不同)。 因此,垃圾收集器無法確定是否將來需要該資源?未能釋放資源可能會導致諸如拒絕服務,性能差等問題。

前面已經回答了,但另一個更省力的辦法就是try with resources

try (FileInputStream fi = new FileInputStream("c:\\search.xls")) { 

     //do something with fi. 
     //fi.getChannel() ; 

    } catch(IOException e) { 
     // exception handling. 
    } finally { 
    // some statements for finally. 
    } 

現在你不需要顯式調用fi.close()方法。

0

最近,當我試圖重構我的代碼時,我不得不將工作簿創建移動到另一個方法,並在該方法中創建FileInputStream。該方法創建一個FileInputStream並返回一個工作簿。但FileInputStream在主要方法中不可見;那麼如何在主方法結束時關閉我的FileInputStream?答案是,您不必關閉FileInputStream,而只需關閉工作簿,該工作簿在內部關閉FileInputStream。總之,不管怎麼說,你必須關閉FileInputStream是不正確的。