На вход приходит byte[] fileData, надо получить на выходе закодированный String
String encoded = Base64.getEncoder().encodeToString(fileData) выбрасывает Out of memory.
Можно ли как-то закодировтаь по частям и потом собрать все это в String?
Надо кодировать кусками, просто при этом надо держать в голове, что по сути алгоритм 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) );
}
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости