poi1.6 执行 workbook.write(outputStream); 会导致每100个row进行一次flush导致Stream流关闭如何解决
时间: 2024-03-18 18:41:02 浏览: 207
Java使用POI导出大数据量Excel的方法
5星 · 资源好评率100%
在 `SXSSFWorkbook` 中,数据的写入是通过缓存来实现的,缓存的默认大小是 100,当达到缓存大小时,`SXSSFWorkbook` 会自动将缓存中的数据写入到磁盘中的临时文件。当写入临时文件的数据量达到指定的内存阈值时,`SXSSFWorkbook` 会将临时文件中的数据写入到输出流中。因此,在使用 `SXSSFWorkbook` 写入数据时,需要注意以下两点:
1. 当临时文件中的数据量达到指定的内存阈值时,`SXSSFWorkbook` 会将临时文件中的数据写入到输出流中,如果此时输出流已经关闭,则会抛出异常。因此,在写入数据时需要保证输出流没有被关闭。
2. 当缓存中的数据量达到指定的大小时,`SXSSFWorkbook` 会将缓存中的数据写入到临时文件中,并清空缓存。因此,如果想要避免在写入临时文件时关闭输出流,可以通过设置缓存大小来实现。例如,可以将缓存大小设置为 1000,这样可以减少写入临时文件的次数,提高性能,同时也可以避免在写入临时文件时关闭输出流。具体示例如下:
```
SXSSFWorkbook workbook = new SXSSFWorkbook(1000);
workbook.setCompressTempFiles(false);
```
这样设置后,缓存大小为 1000,每当写入 1000 行数据时,`SXSSFWorkbook` 会将缓存中的数据写入到临时文件中,并清空缓存。同时,禁用临时文件的压缩可以避免在写入临时文件时关闭输出流。
阅读全文