【问题标题】:Is disposing SXSSFWorkbook necessary when used in try with resource与资源一起使用时是否需要处理 SXSSFWorkbook
【发布时间】:2018-10-25 08:52:53
【问题描述】:

下面是创建SXSSFWorkbook的示例代码sn-p:

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

这里的问题是,如果我对资源使用 try 然后不能 dispose() SXSSFWorkbook 在 finally 中,因为变量 wb 在 finally 块中将无法访问。

我想知道这是删除临时文件所必需的工作簿,或者由于 SXSSFWorkbookAutoCloseable,尝试使用资源会处理它。

【问题讨论】:

    标签: apache-poi autocloseable


    【解决方案1】:

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

    2018 年 5 月,apache poiversion 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

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

    SheetDataWriter.close

    SheetDataWriter.close 只刷新和关闭Writer _out

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

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

    【讨论】:

      【解决方案2】:

      这是问题的正式解决方案。

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

      【讨论】:

      • Apache 的示例不会打扰在工作簿上调用 close。这让我想知道它是否真的需要或者只是缺少这个例子。我讨厌这种错误的例子,因为人们天真地认为它是好的模式会一遍又一遍地复制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2011-08-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多