java:ByteArrayOutputStream.toByteArray()性能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java:ByteArrayOutputStream.toByteArray()性能相关的知识,希望对你有一定的参考价值。

我正在写一个poi工作簿到ByteArrayOutputStream,以获取字节并将其发送到肥皂消息中。

得到ByteArrayOutputStream很好,但调用.toByteArray()非常慢,并消耗了大量的CPU。 我试图转换的工作簿非常大。

有没有人对如何加快速度有任何建议?

谢谢你,杰森

答案

在创建ByteArrayOutputStream对象时是否声明了缓冲区大小?如果没有,您将花时间扩展缓冲区并在每次扩展时复制字节。设置构造函数中所需的最终大小,您应该看到大文件的速度提升。

来自Oracle Documentation:构造函数和描述

ByteArrayOutputStream()

创建一个新的字节数组输出流。

ByteArrayOutputStream(int size)

创建一个新的字节数组输出流,其缓冲区容量为指定大小(以字节为单位)。

另一答案

ByteArrayOutputStream#toByteArray()正在做的唯一密集任务是将字节从内部流缓冲区复制到新的字节数组中。

我确信你不需要这样做,因为无论如何你都会将这些字节发送给SOAP。您应该使用ByteArrayOutputStream#writeTo(OutputStream os)方法将字节流中的字节写入SOAP输出流。

另一答案

还要考虑Spring CoreFastByteArrayOutputStream

它不会在增长时复制字节,也可以通过toByteArrayUnsafe()getInputStream()方法使用它们而不需要复制。

请注意,toByteArrayUnsafe()仅在initialBlockSize足以存储整个数据的情况下才会避免复制。

以上是关于java:ByteArrayOutputStream.toByteArray()性能的主要内容,如果未能解决你的问题,请参考以下文章

使用Docx4j和PdfBox将Docx转换为图像会导致OutOfMemoryError

Java Switch

Java Math

Java 布尔运算

java [Java] Java常用代码#java

Java - 35 Java 实例