Преобразование ByteArrayInputStream.toString приводит к предупреждению о неэффективном преобразовании из ByteArrayOutputStream

#java #spring #spring-boot #outputstream #bytearrayoutputstream

Вопрос:

У меня есть Spring Boot приложение, которое преобразует XML в JSON. Преобразование выполняется путем JAVA application внутреннего вызова другого пользователя и передачи некоторой информации. Реализация вызываемого приложения находится вне моего контроля, и у меня нет доступа для внесения в него каких-либо изменений.

Для вызываемого Java Application требуется a 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())

Комментарии:

1. Вы должны увидеть исправление, предложенное IntelliJ — output.toString(StandardCharsets.UTF_8) .

2. @Sweeper Большое спасибо. Я не уверен, как я не заметил этого. Большое спасибо за ответ. Это сработало для меня.

Ответ №1:

Объяснение этого предупреждения заключается в том, что

   new String(output.toByteArray());
 

создает a byte[] из содержимого ByteArrayOutputStream , затем создает a String из byte[] . Это означает ненужное копирование данных.

Исправление, предложенное Intellij, заключается в следующем:

  output.toString(StandardCharsets.UTF_8).
 

который создает String в одной операции без создания промежуточного byte[] .

Как он это делает?

Колодец toString() передает ByteArrayOutputStream внутренний byte[] буфер String конструктору. Напротив, output.toByteArray() это копирование буфера в новый byte[] … чтобы вызывающий не мог вмешиваться в фактическое содержимое буфера.