我有一个
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());
从
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 在幕后将字节从一种编码映射到另一种编码。