与资源一起使用时是否需要处理 SXSSFWorkbook

eat*_*ode 4 apache-poi autocloseable

下面是要创建的示例代码片段SXSSFWorkbook

try(SXSSFWorkbook wb = new SXSSFWorkbook()) {
    //...
} finally {
    wb.dispose(); //wb not accessible over here, so can't use try with resource
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是,如果我将 try 与资源一起使用,则无法dispose() SXSSFWorkbook在 finally 中使用,因为wb在 finally 块中将无法访问变量。

我想知道正在处理删除临时文件所必需的工作簿,或者因为SXSSFWorkbookAutoCloseable,所以尝试使用资源会处理它。

Axe*_*ter 6

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

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

SXSSFWorkbook.java :

public class SXSSFWorkbook implements Workbook

那么为什么这可以成为在 try with 资源中使用的资源呢?因为

工作簿.java

public interface Workbook extends Closeable, Iterable<Sheet>

所以org.apache.poi.ss.usermodel.Workbook扩展java.io.Closeable等实现 this 的类必须提供一个方法 close

SXSSFWorkbook.close

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

SheetDataWriter.close

SheetDataWriter.close只刷新并关闭Writer _out.

所以不,dispose直到现在(2018 年 5 月)在apache poi版本中自动关闭时都没有调用3.17

并且只有SheetDataWriter.dispose会删除TempFile _fd为每个工作表创建的。