try-with-resources 是否调用 dispose() 方法?

问题描述 投票:0回答:2

我经常使用 try-with-resources。我一直将它用于数据库资源类型或

File
之类的东西来关闭资源。

现在,我正在使用 POI 处理大型 Excel 文件,我只是注意到我应该调用

workbook.dispose()
。 try-with-resources 会调用
dispose()
方法吗?我查到的所有内容都只涵盖
close()

java try-with-resources autocloseable
2个回答
3
投票

不,try-with-resources 仅适用于实现

java.lang.AutoCloseable
的对象。该接口定义了一个方法:
close()
。该
close
方法是 try-with-resources 语法调用的唯一方法。

引用 try-with-resources 的教程:

任何实现

java.lang.AutoCloseable
的对象(包括实现
java.io.Closeable
的所有对象)都可以用作资源。

任何

dispose()
方法都不会自动调用。但是,这些类/库的开发人员可能决定在
dispose()
方法的实现中调用
close()
,反之亦然。在这种情况下,两种“清理”方法都会执行相同的操作。


2
投票

Try-with-resources 仅支持

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。

© www.soinside.com 2019 - 2024. All rights reserved.