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

问题描述 投票:0回答:1

我有一个

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())

java spring spring-boot outputstream bytearrayoutputstream
1个回答
2
投票

这个警告的解释是

  new String(output.toByteArray());

byte[]
的内容创建一个
ByteArrayOutputStream
,然后从
String
创建一个
byte[]
。那是在做一个不必要的数据副本。

Intellij 建议的修复1 是:

 output.toString(StandardCharsets.UTF_8).

在单个操作中创建

String
而无需创建中间
byte[]
.

它是怎么做到的?

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


1 - 事实上,建议的修复与您的原始代码没有相同的语义。该修复程序使用特定字符集 (UTF-8) 将字节转换为字符串。您的原始代码使用平台的默认字符集。在上下文中,修复看起来比原来的修复更正确......因为字节似乎已经开始为 UTF-8。但是我猜转换器 could 在幕后将字节从一种编码映射到另一种编码。

© www.soinside.com 2019 - 2024. All rights reserved.