我在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功能?如果是这样,请指导我一些编码。
答案 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。答案就在那里。