我必须关闭FileInputStream吗?

Ola*_*n.S 26 java file-io inputstream

我是测试自动化的实习生.我正在使用Eclipse创建Junit代码并使用Eclipse运行.我正在使用FileInputStream函数从excel表中重新获取数据.

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

是否有必要关闭Inputstream功能?如果是这样,请指导我一些编码.

asg*_*sgs 27

是的,close如果您希望恢复系统资源,则需要输入流.

FileInputStream.close() 是你需要的.


Axe*_*xel 8

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小注释 - 你还需要使用try/catch包装`close()`语句作为`close()`声明来抛出一个已检查的IOException.事实上,你不能像那样终于使用.您只能尝试使用运行时异常.但是使用像IOException和它的子类之类的已检查异常,你必须有一个try/catch或try/catch/finally ......它不会只用try/finally编译. (6认同)
  • 取决于是否为方法声明了IOException.如果你抓住它,你应该知道如何处理它.重要的部分是将close()放在finally块中.事实上,自动处理这是我真正期待在Java 7中看到的功能之一. (3认同)

Pet*_*rey 7

您需要关闭()或结束您的程序.

但是,如果不关闭文件,则可能会遇到令人困惑的问题

  • 有时单独运行测试或在同一过程中运行一组测试.(所以你可以进行一种测试,但不是另一种测试)
  • 您无法重命名或删除打开的文件.

最佳做法是始终关闭您已完成的资源,但我将单元测试视为脚本,并不总是必须遵循最佳实践.


pcj*_*zer 5

关闭你使用的资源总是一个好主意,但是:

如果您在资源B中使用资源A,那么如果它有一个方法,则关闭B而不是A是明智的.

在你的情况下,你使用FileInputStreamin Workbook,所以你最好关闭Workbook并依赖Workbok它将关闭FileInputStream.

在这种特殊情况下,实际上,Workbook FileInputStreamgetWorkbook()方法结束时关闭,但关闭 Workbook能够被垃圾收集仍然是个好主意.


ful*_*per 5

是! 处理完资源后,应始终释放它们一次。Java具有强大的垃圾收集机制(请注意,与资源管理/泄漏相比,它是不同的东西。)因此,垃圾收集器无法确定您将来是否需要该资源?未能释放资源可能会导致诸如拒绝服务,性能不佳之类的问题。

正如已经回答的,但是另一种省力的方法是尝试使用资源

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

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

    } catch(IOException e) {
        // exception handling.
    } finally {
    // some statements for finally.
   }
Run Code Online (Sandbox Code Playgroud)

现在,您无需显式调用fi.close()方法。