SXSSF: куда он сбрасывает строки не в окне перед выводом в файл? - PullRequest
8 голосов
/ 14 сентября 2011

Согласно документации SXSSF (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 Ответ

10 голосов
/ 14 сентября 2011

Класс, который выполняет буферизацию: SheetDataWriter in org.apache.poi.xssf.streaming.SXSSFSheet

Волшебная линия, которая вас, вероятно, интересует, такова:

_fd = File.createTempFile("poi-sxxsf-sheet", ".xml");

С точки зрения того, что это безопасно,вероятно, но не обязательно ... Вероятно, стоит открыть ошибку в poi bugzilla и запросить ее переключение на использование org.apache.poi.util.TempFile, что позволяет немного больше контроля.Тем не менее, в общем, если вы укажете действительное свойство для java.io.tmpdir (или для вас подходит значение по умолчанию), все будет в порядке

...