#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[]
… чтобы вызывающий не мог вмешиваться в фактическое содержимое буфера.