У меня возникла ситуация, когда мне нужно знать размер пары кодирования String
/в байтах, но не может использовать метод getBytes()
, потому что 1) String
очень большой, и дублирование String
в массиве byte[]
будет использовать большой объем памяти, но больше к точке 2) getBytes()
выделяет массив byte[]
на основе длины String
* максимально возможных байтов на символ. Поэтому, если у меня есть String
с символами 1.5B и кодировкой UTF-16, getBytes()
попытается выделить массив 3 ГБ и сбой, так как массивы ограничены 2^32 - X байтами (X - спецификация Java).Получить размер строки с кодировкой в байтах без преобразования в байты []
Итак - есть ли способ вычислить размер байта пары кодирования String
/непосредственно из объекта String
?
UPDATE:
Вот рабочая реализация ответа jtahlborn в:
private class CountingOutputStream extends OutputStream {
int total;
@Override
public void write(int i) {
throw new RuntimeException("don't use");
}
@Override
public void write(byte[] b) {
total += b.length;
}
@Override public void write(byte[] b, int offset, int len) {
total += len;
}
}
Длина в байтах зависит от вашей целевой кодировке. Например, «test» .getBytes («UTF-8») составляет 4 байта, но «test» .getBytes («UTF-16») составляет 10 байт (да, 10, попробуйте). Поэтому вам нужно немного уточнить свой вопрос. – brettw
Я бы добавил, что он также зависит от кодовой точки («символов»), которую вы кодируете. Например, в UTF-16 определенная точка кода использует 1 блок кода, другие используют 2 (блок кода имеет длину 16 бит). UTF-8 может принимать от 1 до 4 байтов на символ. – Francis
@brettw Извините, если я плотный, но да, ваш комментарий - это вопрос: с учетом строки и кодировки, сколько байтов требует кодировка строки? Перечитывая вопрос, это кажется мне совершенно понятным - есть ли у вас какие-либо предложения по его переписыванию? – elhefe