首页 文章

SXSSF:在输出到文件之前,它在哪里刷新不在窗口中的行?

提问于
浏览
8

根据SXSSF (Streaming Usermodel API) documentation

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

    执行缓冲的类是 SheetDataWriterorg.apache.poi.xssf.streaming.SXSSFSheet

    你可能感兴趣的神奇线是:

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

    就安全而言,可能,但不一定......可能值得在poi bugzilla中打开一个错误,并要求将其切换为使用 org.apache.poi.util.TempFile ,这样可以进行更多控制 . 一般来说,只要你为 java.io.tmpdir 指定一个有效的属性(或默认对你来说是明智的)你应该没问题

相关问题