我经常使用 try-with-resources。我一直将它用于数据库资源类型或
File
之类的东西来关闭资源。
现在,我正在使用 POI 处理大型 Excel 文件,我只是注意到我应该调用
workbook.dispose()
。 try-with-resources 会调用 dispose()
方法吗?我查到的所有内容都只涵盖close()
。
java.lang.AutoCloseable
的对象。该接口定义了一个方法:close()
。该 close
方法是 try-with-resources 语法调用的唯一方法。
引用 try-with-resources 的教程:
任何实现
的对象(包括实现java.lang.AutoCloseable
的所有对象)都可以用作资源。java.io.Closeable
任何
dispose()
方法都不会自动调用。但是,这些类/库的开发人员可能决定在 dispose()
方法的实现中调用 close()
,反之亦然。在这种情况下,两种“清理”方法都会执行相同的操作。
AutoClosable
接口,并且只会调用 close()
方法。您可以在此处阅读更多内容。
您do可以选择使用包装器(如有必要),它将实现
AutoClosable
并在dispose()
方法中调用close()
。
这是一个基本示例(未经测试):
public class WorkbookResource implements AutoCloseable {
private SXSSFWorkbook workbook;
public WorkbookResource(SXSSFWorkbook workbook) {
this.workbook = workbook;
}
// Delegate methods
@Override
public void close() throws Exception {
workbook.dispose();
workbook.close();
}
}
我对 Apache POI 不太了解,但您可能想验证是否需要同时调用 close 和 dispose。