我必须关闭FileInputStream吗?

时间:2011-02-23 12:29:33

标签: java file-io inputstream

我在Test Automation担任实习生。 我正在使用Eclipse创建Junit代码并使用Eclipse运行。 我正在使用FileInputStream函数从excel表中重新获取数据。

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

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

9 个答案:

答案 0 :(得分:25)

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

FileInputStream.close()就是您所需要的。

答案 1 :(得分: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();
    }
}

答案 2 :(得分:7)

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

但是,如果不将文件关闭为

,则可能会遇到令人困惑的问题
  • 有时单独运行测试或在同一过程中运行一组测试。 (所以你可以通过一种方式进行测试而不是另一种方式)
  • 您无法重命名或删除打开的文件。

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

答案 3 :(得分:5)

关闭您使用的资源总是一个好主意,

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

在您的情况下,您使用FileInputStream中的Workbook,因此您最好关闭Workbook并依靠Workbok它将关闭FileInputStream

在这种特殊情况下,实际上Workbook will close FileInputStream位于getWorkbook()方法的末尾,但close {{仍然是个好主意1}}能够被垃圾收集。

答案 4 :(得分:4)

是的!完成后,应始终释放一次资源。 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()方法。

答案 5 :(得分:0)

最近,当我尝试重构代码时,我不得不将工作簿创建移动到另一个方法,并在该方法中创建FileInputStream。该方法创建一个FileInputStream并返回一个Workbook。但是从main方法看不到FileInputStream;那么我将如何在main方法结束时关闭我的FileInputStream?答案是,您不必关闭FileInputStream,而只需关闭工作簿,该工作簿在内部关闭FileInputStream。简而言之,无论如何都必须关闭FileInputStream是不正确的。

答案 6 :(得分:0)

我这样做是为了确保关闭excel文件输入流,这可能会有所帮助

abstract int workWithWorkBook(Workbook workBook);

protected int doWorkBook(Path excelFile) throws IOException {
    File f = excelFile.toFile();

    try (FileInputStream excelContent = new FileInputStream(excelFile.toFile())){
        POIFSFileSystem fileSystem = new POIFSFileSystem(excelContent);
        Workbook workBook = null;
        if (f.getName().endsWith("xls")) {
            workBook = new HSSFWorkbook(fileSystem);
        } else if (f.getName().endsWith("xlsx")) {
            workBook = new XSSFWorkbook(excelContent);
        }
        return workWithWorkBook(workBook);

    }catch (Exception e){
        e.printStackTrace();
        throw e;
    }
}

9b9ea92b-5b63-47f9-a865-fd40dd602cd5

答案 7 :(得分:0)

做这样的事情。

FileInputStream fi=null;
try{
fi = new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);
}catch(IOException ioe){
}finally{
if(fi != null){
fi.close();
}
fi = null;//This will be hint to get finalize() called on fi so that underlying resources used will released like files opened.
}

答案 8 :(得分:-1)

Basic CompSci 101告诉我们确保以Java或任何语言关闭我们打开的资源。所以是的,你需要关闭它们。如果你不这样做,就会发生坏juju。

此外,您应该学习(并有倾向)使用Javadocs。查看FileInputStream和Closeable的Javadoc。答案就在那里。