Java 如何在调用SXSSFWorkbook的write()方法之前获取其大小?

Java 如何在调用SXSSFWorkbook的write()方法之前获取其大小?,java,apache-poi,Java,Apache Poi,我需要将ArrayList(动态大小)传输到基于SXSSFWorkbook的ByteArrayOutputStream,而不需要实际的工作簿文件。 我成功地完成了下面的代码 1.新的SXSSF工作手册 SXSSFWorkbook wb = new SXSSFWorkbook(100); 2.循环ArrayList以填写上面的“wb” 3.将“wb”传输到ByteArrayOutputStream ByteArrayOutputStream bos = new ByteArrayOutputSt

我需要将ArrayList(动态大小)传输到基于SXSSFWorkbook的ByteArrayOutputStream,而不需要实际的工作簿文件。 我成功地完成了下面的代码

1.新的SXSSF工作手册

SXSSFWorkbook wb = new SXSSFWorkbook(100);
2.循环ArrayList以填写上面的“wb”

3.将“wb”传输到ByteArrayOutputStream

ByteArrayOutputStream bos = new ByteArrayOutputStream( 6000 ); // my question is the buffer
wb.write(bos);
byte[] byteContent = bos.toByteArray();
bos.close();
wb.dispose();
// an API for users to download the real WorkBook file
// and the API needs a byte[] type for the 1st argument.
createDownloadUrl(byteContent, fileName);
它可以工作,但我认为缓冲区(这里是6000)应该等于“wb”的大小,而不是一个固定的数字(例如,这里是6000)。 我的问题是如何在不写入实际工作簿文件的情况下/在写入实际工作簿文件之前获取“wb”的大小


谢谢大家!

为什么不跳过设置大小,让Java自动调整大小?ByteArrayOutputStream的初始大小只是数组的初始大小。如果
write
需要更多的字节,则会采用该大小的新附加数组,如果准备就绪,则会将所有数组放在一起。因此,初始大小必须不是所需的确切大小。它不应该太小,这样就不需要太多的单个阵列,也不应该太大,这样就不需要太多的分配内存。初始大小为1024(1K字节)应该是一个很好的折衷方案。感谢您的快速回复!这是否意味着ByteArrayOutputStream将像StringBuffer一样自动调整其长度,我们不必担心它?我发现关于ByteArrayOutputStream()构造函数的论文“创建一个新的字节数组输出流。缓冲区容量最初是32字节,但如果必要,其大小会增加。”感谢加格拉瓦和阿克塞尔·里克特。