在try with resource中使用时需要配置SXSSFWorkbook

时间:2018-05-15 13:32:18

标签: apache-poi autocloseable

以下是要创建try(SXSSFWorkbook wb = new SXSSFWorkbook()) { //... } finally { wb.dispose(); //wb not accessible over here, so can't use try with resource } 的示例代码段:

dispose()

这里的问题是,如果我使用try with resource,那么最后可以SXSSFWorkbook wb,因为变量SXSSFWorkbook在finally块中无法访问。

我想知道处理删除临时文件所需的工作簿,或者因为AutoCloseableclass ProductExtended { /** @var Product **/ private $product; /** @var float **/ private $originalPrice; /** @var float **/ private $discountedPrice; ... ,尝试使用资源会处理它。

2 个答案:

答案 0 :(得分:3)

不确定apache poi程序员是否有人会回复此问题。但apache poi是开源的。因此,每个程序员都可以通过查看代码来回答这个问题。

状态2018年5月,apache poi版本3.17

SXSSFWorkbook.java

public class SXSSFWorkbook implements Workbook

那么为什么这可以成为使用资源尝试的资源?因为

Workbook.java

public interface Workbook extends Closeable, Iterable<Sheet>

因此org.apache.poi.ss.usermodel.Workbook扩展java.io.Closeable,因此实现此目的的类必须提供方法close

SXSSFWorkbook.close

如您所见,单个SheetDataWriter将会关闭,然后内部XSSFWorkbook _wb将会关闭。

SheetDataWriter.close

SheetDataWriter.close仅刷新并关闭Writer _out

所以不,在dispose版本apache poi

中自动关闭到现在(2018年5月)时调用3.17

只有SheetDataWriter.dispose会删除为每张工作表创建的TempFile _fd

答案 1 :(得分:0)

这是问题的解决方案。

SXSSFWorkbook t_wb = null;
try(SXSSFWorkbook wb = t_wb = new SXSSFWorkbook()) {
    //...
} finally {
    if(t_wb != null) t_wb.dispose();
}