Spring Boot应用中解决ByteArrayOutputStream转String的低效转换警告方案咨询
解决ByteArrayOutputStream转String的低效警告问题
嘿,这问题我之前也碰到过!IntelliJ提示的这个警告,核心原因是你现在的写法做了一次多余的字节数组拷贝——output.toByteArray()会创建一个新的字节数组,把内部缓冲区的内容复制进去,然后new String()又基于这个新数组生成字符串,确实有点浪费。
好在有个简单的优化方案,完全适配你没法提前预估输出大小的场景:
直接使用ByteArrayOutputStream自带的toString(Charset)方法(Java 10+支持),如果你的项目用的是Java 8,可以用toString(String charsetName)代替。这个方法不需要先转成字节数组,直接利用内部缓冲区的有效数据(也就是写入的那部分内容)来构造字符串,避免了额外的数组拷贝,效率更高,也能消除IDE的警告。
修改后的代码如下:
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))); // 替换原来的new String(output.toByteArray()) return output.toString(StandardCharsets.UTF_8);
为什么这个方法有效?
toByteArray()会创建一个新的字节数组,长度等于写入的字节数,把内部缓冲区的内容复制进去,这是一次额外的内存开销。toString(Charset)直接使用ByteArrayOutputStream内部的缓冲区数组(只取前count个字节,也就是实际写入的内容)来构造字符串,跳过了数组拷贝的步骤,既节省内存又提升效率。
这样调整后,既不需要提前预估输出大小,又解决了IDE的警告,完全符合你的需求~
内容的提问来源于stack exchange,提问作者BATMAN_2008
相关产品推荐
相关产品推荐

