ByteArrayInputStream.toString 的转换导致警告 Inefficient conversion from ByteArrayOutputStream

Conversion of ByteArrayInputStream.toString results in warning Inefficient conversion from ByteArrayOutputStream

我有一个 Spring Boot 应用程序可以将 XML 转换为 JSON。转换是通过在内部调用另一个 JAVA application 并传递一些信息来完成的。被调用应用程序的实现不在我的控制范围内,我无权对其进行任何更改。

被调用的 Java Application 需要一个 OutputStream 所以我使用 ByteArrayOutputStream 并在方法中传递它。收到输出后,我将 OutputStream 转换为 String。在转换过程中,我 运行 进入警告 Inefficient conversion from ByteArrayOutputStream

我想知道如何修复此警告。我研究了一下,发现我们需要传递 ByteArrayOutputStream 的大小,但在我的情况下,我不知道它可以有多少大小,因为它取决于我输入的 XML 的大小我在给。所以我无法预测和设置它。

有人可以指导我在 Spring Boot 应用程序 ByteArrayOutputStream 中可以做什么,以便修复我在 Intellij IDE 中收到的警告: Inefficient conversion from ByteArrayOutputStream

以下是我的代码示例:

final InputStream inputStream = new ByteArrayInputStream(xmlEvents.getBytes(StandardCharsets.UTF_8));
final var output = new ByteArrayOutputStream();
new Converter().convert(inputStream, new Handler<>(new Validator(), new StreamCollector(output)));
return new String(output.toByteArray());

我收到以下行的警告: new String(output.toByteArray())

这个警告的解释是

  new String(output.toByteArray());

ByteArrayOutputStream 的内容创建一个 byte[],然后从 byte[] 创建一个 String。那就是对数据进行不必要的复制。

Intellij 建议的修复是:

 output.toString(StandardCharsets.UTF_8).

在单个操作中创建 String,而无需创建中间 byte[]

它是怎么做到的?

好吧 toString() 正在将 ByteArrayOutputStream 的内部 byte[] 缓冲区传递给 String 构造函数。相比之下,output.toByteArray() 正在将缓冲区复制到新的 byte[] ... 这样调用者就不会干扰实际缓冲区的内容。