2011-02-23 99 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是不正确的。