SXSSF: куда он сбрасывает строки не в окне перед выводом в файл?
Согласно документации SXSSF (Streaming Usermodel API):
SXSSF (пакет:
org.apache.poi.xssf.streaming
) является API-совместимым потоковым расширением XSSF, которое используется, когда необходимо создавать очень большие электронные таблицы, а пространство кучи ограничено. SXSSF достигает своего низкого объема памяти, ограничивая доступ к строкам, которые находятся в скользящем окне, в то время как XSSF предоставляет доступ ко всем строкам в документе. Старые строки, которых больше нет в окне, становятся недоступными, так как они записываются на диск.
Однако в приведенном примере очистка происходит до того, как в рабочей книге указывается местоположение файла, в который следует записать файл.
public static void main(String[] args) throws Throwable {
Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
Sheet sh = wb.createSheet();
for(int rownum = 0; rownum < 1000; rownum++){
Row row = sh.createRow(rownum);
for(int cellnum = 0; cellnum < 10; cellnum++){
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address);
}
}
// Rows with rownum < 900 are flushed and not accessible
for(int rownum = 0; rownum < 900; rownum++){
Assert.assertNull(sh.getRow(rownum));
}
// ther last 100 rows are still in memory
for(int rownum = 900; rownum < 1000; rownum++){
Assert.assertNotNull(sh.getRow(rownum));
}
FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
wb.write(out);
out.close();
}
Так что напрашиваются вопросы:
- Где в файловой системе хранятся данные?
- Это просто создание временного файла во временном каталоге по умолчанию?
- Это безопасно для всех / большинства реализаций?
1 ответ
Класс, который выполняет буферизацию SheetDataWriter
в org.apache.poi.xssf.streaming.SXSSFSheet
Волшебная линия, в которой вы, вероятно, заинтересованы:
_fd = File.createTempFile("poi-sxxsf-sheet", ".xml");
С точки зрения того, что это безопасно, вероятно, но не обязательно... Вероятно, стоит открыть ошибку в poi bugzilla и запросить ее переключение на использование org.apache.poi.util.TempFile
что позволяет немного больше контроля. В целом, если вы укажете действительное свойство для java.io.tmpdir
(или значение по умолчанию является разумным для вас), вы должны быть в порядке