我正在将poi工作簿写入ByteArrayOutputStream,以便获取字节并将它们发送到soap消息中。
获取ByteArrayOutputStream是可以的,但是调用.toByteArray()非常慢,占用了大量的cpu。
我试图转换的工作簿非常大。
有人对我如何加快速度有什么建议吗?
谢谢你,杰森
发布于 2014-02-27 16:16:00
在创建ByteArrayOutputStream对象时,是否声明了缓冲区大小?如果不是,您将花费时间来展开缓冲区,并在每次扩展时复制字节。设置构造函数中所需的最终大小,您将看到大型文件的速度有所提高。
来自Oracle文档:构造函数和描述
ByteArrayOutputStream()创建一个新的字节数组输出流。
ByteArrayOutputStream(int size)创建具有指定大小的缓冲区容量的新字节数组输出流(以字节为单位)。
发布于 2014-02-27 16:55:08
ByteArrayOutputStream#toByteArray()正在执行的唯一密集任务是将字节从内部流缓冲区复制到新的字节数组中。
我相信您不需要这样做,因为无论如何您都会将这些字节发送到SOAP。您应该使用ByteArrayOutputStream#writeTo(OutputStream os)方法将字节流中的字节写入SOAP输出流。
发布于 2018-03-01 08:51:55
还可以考虑一下弹簧芯的FastByteArrayOutputStream。
它不会在增长时复制字节,并且还允许通过toByteArrayUnsafe()和getInputStream()方法使用字节而不进行复制。
请注意,toByteArrayUnsafe()将避免仅在initialBlockSize对整个数据足够的情况下进行复制。
https://stackoverflow.com/questions/22073949
复制相似问题