【问题标题】:Conversion of ByteArrayInputStream.toString results in warning Inefficient conversion from ByteArrayOutputStreamByteArrayInputStream.toString 的转换导致警告 ByteArrayOutputStream 的转换效率低下
【发布时间】:2021-10-12 22:41:12
【问题描述】:

我有一个将 XML 转换为 JSON 的 Spring Boot 应用程序。通过在内部调用另一个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())

【问题讨论】:

  • 您应该会看到 IntelliJ 建议的修复 - output.toString(StandardCharsets.UTF_8)
  • @Sweeper 非常感谢。我不知道我是怎么错过的。非常感谢您的回复。这对我有用。

标签: java spring spring-boot outputstream bytearrayoutputstream


【解决方案1】:

这个警告的解释是

  new String(output.toByteArray());

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

Intellij 建议的修复方法是:

 output.toString(StandardCharsets.UTF_8).

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

它是如何做到的?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多