poi 3.8 中存在SXSSFWorkbook 但是没有despose() 方法,使用时间长了的话有可能造成磁盘没有空间,
window环境本地缓存会存放在C盘用户下面AppDate\Local\Temp 下面
linux环境下会存放在 temp/poifile 录下,
解决这个问题可以使用下面代码。在wookbook写完数据的时候调用此方法deleteSXSSFTempFiles(workbook),
import java.lang.reflect.Field;
import org.apache.poi.xssf.streaming.SheetDataWriter;
public static void deleteSXSSFTempFiles(SXSSFWorkbook workbook)
throws NoSuchFieldException, IllegalAccessException {
int numberOfSheets = workbook.getNumberOfSheets();
// iterate through all sheets (each sheet as a temp file)
for (int i = 0; i < numberOfSheets; i++) {
Sheet sheetAt = workbook.getSheetAt(i);
// delete only if the sheet is written by stream
if (sheetAt instanceof SXSSFSheet) {
SheetDataWriter sdw = (SheetDataWriter) getPrivateAttribute(
sheetAt, "_writer");
File f = (File) getPrivateAttribute(sdw, "_fd");
try {
f.delete();
} catch (Exception ex) {
// could not delete the file
}
}
}
}
public static Object getPrivateAttribute(Object containingClass,
String fieldToGet) throws NoSuchFieldException,
IllegalAccessException {
// get the field of the containingClass instance
Field declaredField = containingClass.getClass().getDeclaredField(
fieldToGet);
// set it as accessible
declaredField.setAccessible(true);
// access it
Object get = declaredField.get(containingClass);
// return it!
return get;
}