资源泄漏:使用Apache.POI XSSFWorkbook时,工作簿永远不会被关闭

时间:2015-08-05 11:16:48

标签: java garbage-collection apache-poi

因此,我使用Apache POI将Excel文件解析为我的数据库。为此,我正在初始化XSSFWorkbook,如下所示:

XSSFWorkbook workbook = new XSSFWorkbook(fIP);

然后我继续我的方法。 workbook.close()不可用作以后关闭工作簿的方法。关于如何在任务完成后让垃圾收集进入工作簿的任何想法?

3 个答案:

答案 0 :(得分:9)

我有这个问题,而且没什么意义。 最后我跟踪问题到我的IDE(netbeans)正在拿起早期版本的POI库(v3.8),它没有“关闭”方法。 因此,请检查您的类路径,并查找不同版本的POI库的重复导入。

答案 1 :(得分:3)

docs表示该类实现了Closeable。因此它有一个close()方法,您可以像这样关闭工作簿:

XSSFWorkbook workbook = new XSSFWorkbook(fIP)

// Do your stuff;

workbook.close();

由于该类还实现了AutoCloseable,你也可以使用try-with-resources块:

try (XSSFWorkbook workbook = new XSSFWorkbook(fIP)) {
    // Do your stuff
}

如果使用此方法,则在try块完成后将自动关闭工作簿。

答案 2 :(得分:0)

只需从以下的apache页面更改示例:

try {
    FileInputStream excelFile = new FileInputStream(new File(FILE_NAME));
    Workbook workbook = new XSSFWorkbook(excelFile);
    //more stuffs
}

要:

Workbook workbook;
try {
    InputStream excelFile = file.getInputStream();
    workbook = new XSSFWorkbook(excelFile);
    //more stuffs

    workbook.close();
    excelFile.close();
}