我正在测试自动化领域担任实习生。 我使用Eclipse创建Junit代码并在Eclipse中运行。 在此过程中,我使用FileInputStream函数从Excel表格中检索数据。
FileInputStream fi=new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);
关闭Inputstream函数是必要的吗?如果是,请给我一些示例代码。
我正在测试自动化领域担任实习生。 我使用Eclipse创建Junit代码并在Eclipse中运行。 在此过程中,我使用FileInputStream函数从Excel表格中检索数据。
FileInputStream fi=new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);
关闭Inputstream函数是必要的吗?如果是,请给我一些示例代码。
是的,如果您想释放系统资源,您需要 close
输入流。
FileInputStream.close()
就是您所需的方法。
您需要使用 close() 方法关闭文件,或结束程序运行。
如果不关闭文件,可能会遇到以下问题:
最佳实践是在完成资源后始终关闭它们,但是我认为单元测试是一些脚本,不一定要严格遵循最佳实践。
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();
}
}
close()
语句,因为 close()
声明会抛出一个已检查的 IOException。实际上,你不能像那样只使用 finally。你只能在运行时异常中使用 try/finally。但对于像 IOException 及其子类这样的已检查异常,你必须有一个 try/catch 或者 try/catch/finally...不仅有 try/finally 是不会编译通过的。 - luis.espinal try (FileInputStream fi = new FileInputStream("c:\\search.xls")) {
//do something with fi.
//fi.getChannel() ;
} catch(IOException e) {
// exception handling.
} finally {
// some statements for finally.
}
Workbook 实现了 Closeable 接口,这意味着您应该调用 close() 方法或使用 try-with-resources 来释放 Workbook 对象获取的资源。
仅仅观察 Workbook 有一个 close() 方法,并不能得出 InputStream 资源的使用方式。
实际上,Workbook 构造函数使用流来初始化自身。构造函数不保留对流的引用。Workbook 构造函数不关闭 InputStream。关闭 InputStream 是您的责任,您可以在构造 Workbook 对象后立即执行此操作。因此,以下代码是正确的:
private static Workbook getWorkbook() throws IOException {
try (InputStream is = ...) {
return WorkbookFactory.create(is); // newer API
}
}
try (Workbook workbook = getWorkbook()) {
Sheet sheet = workbook.getSheet("SheetName");
...
}
我使用这种方式来确保关闭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
Workbook
接口没有名为 close
的方法,我该如何关闭 Workbook
? - Yu Jiaao做类似这样的事情。
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.
}
计算机科学101告诉我们确保在Java或任何语言中关闭打开的资源。因此,是的,您需要关闭它们。如果不这样做,就会发生糟糕的事情。
此外,您应该学习(并有倾向)使用Javadocs。查看FileInputStream和Closeable的Javadoc,答案就在那里。