Я ищу некоторый класс/метод util, чтобы взять большой String
и вернуть InputStream
.
Если String
мал, я могу просто сделать:
InputStream is = new ByteArrayInputStream(str.getBytes(<charset>));
Но когда размер String
большой (1 МБ, 10 МБ или более), массив байтов от 1 до 2 раз (или более?), такой же большой, как моя строка, выделяется на месте. (И поскольку вы не знаете, сколько байтов выделяется точно до того, как все кодирование будет выполнено, я думаю, что должны быть другие массивы/буферы, выделенные до выделения финального байтового массива).
У меня есть требования к производительности и вы хотите оптимизировать эту операцию.
В идеале, я думаю, класс/метод, который я ищу, будет кодировать символы "на лету" на одном небольшом блоке за раз, когда потребляется InputStream, и поэтому не происходит большой всплеск распределения памяти.
Глядя на исходный код apache commons IOUtils.toInputStream(..)
, я вижу, что он также преобразует String в большой массив байтов за один раз.
И StringBufferInputStream
устарел и не выполняет работу должным образом.
Есть ли такой класс/метод использования из любого места? Или я могу написать пару строк кода, чтобы сделать это?
Функциональная необходимость в этом заключается в том, что в другом месте я использую метод util, который принимает InputStream
и выдает байты из этого InputStream
.
Я не думаю, что другие люди ищут что-то подобное. Я что-то придумываю где-то?
Я начал писать пользовательский класс для этого, но остановился бы, если бы было лучшее/правильное/правильное решение/исправление для моей потребности.