Как закодировать большой массив байтов в base64 без Out of memory в Java?

164
02 октября 2021, 08:20

На вход приходит byte[] fileData, надо получить на выходе закодированный String

String encoded = Base64.getEncoder().encodeToString(fileData) выбрасывает Out of memory.

Можно ли как-то закодировтаь по частям и потом собрать все это в String?

Answer 1

Надо кодировать кусками, просто при этом надо держать в голове, что по сути алгоритм base64 - это превращение 3 байт - в 4 байта, то есть если длина исходного бинарного массива кратна 3, то никаких проблем не возникает, проблема возникает только если длина массива некратна 3 - тогда начинается всякая муть связанная с выравниванием - в стандарте символ выравнивания это = (хотя можно и другой). Например:

abc - YWJj

ab - YWI=

a - YQ==

соответственно при кодировании кусками надо учитывать эту особенность base64:

private static final int BUFFER_SIZE = 3 * 1024;
try ( BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE); ) {
    Base64.Encoder encoder = Base64.getEncoder();
    StringBuilder result = new StringBuilder();
    byte[] chunk = new byte[BUFFER_SIZE];
    int len = 0;
    while ( (len = in.read(chunk)) == BUFFER_SIZE ) {
         result.append( encoder.encodeToString(chunk) );
    }
    if ( len > 0 ) {
         chunk = Arrays.copyOf(chunk,len);
         result.append( encoder.encodeToString(chunk) );
    }
}
READ ALSO
Ошибка в IDE "cannot resolve a symbol"

Ошибка в IDE "cannot resolve a symbol"

Всем привет , писал код и вдруг IDE начала выдавать ошибку "cannot resolve a symbol"Помогите пожалуйста решить проблему

264
MySQL Сведение разных таблиц в одну

MySQL Сведение разных таблиц в одну

Доходы фитнесс-клуба состоят из покупок абонементов и складываются в таблицу:

147
mysql: определить пол по имени (поиск значения из списка слов в поле, содержащем несколько слов)

mysql: определить пол по имени (поиск значения из списка слов в поле, содержащем несколько слов)

Подскажите как сделать запрос в БД, чтобы выбрать только такие записи, в которых пользователь имеет определённый пол?

246
Как лучше написать sql запрос

Как лучше написать sql запрос

Есть две таблицы

177