Нужно ли удалять SXSSFWorkbook при использовании в попытке с ресурсом - PullRequest
0 голосов
/ 15 мая 2018

Ниже приведен пример кода для создания SXSSFWorkbook:

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.

Я хотел знать, что утилита рабочей книги необходима для удаления временных файлов или поскольку SXSSFWorkbook равен AutoCloseable, попытка с ресурсом позаботится об этом.

Ответы [ 2 ]

0 голосов
/ 30 июля 2019

Это формальное решение проблемы.

SXSSFWorkbook t_wb = null;
try(SXSSFWorkbook wb = t_wb = new SXSSFWorkbook()) {
    //...
} finally {
    if(t_wb != null) t_wb.dispose();
}
0 голосов
/ 16 мая 2018

Не уверен, что кто-то из apache poi программистов ответит на это. Но apache poi с открытым исходным кодом. Так что каждый программист может ответить на этот вопрос сам, посмотрев на код.

Штат май 2018, 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 s будут закрыты, а затем внутренне XSSFWorkbook _wb будут закрыты.

SheetDataWriter.close

SheetDataWriter.close только сбрасывает и закрывает Writer _out.

Так что нет, нигде не вызывается dispose при автоматическом закрытии до сих пор (май 2018 г.) в apache poi версии 3.17

И только SheetDataWriter.dispose будет удалять TempFile _fd, созданный для каждого листа.

...