Боюсь, у меня вопрос по мелочи довольно перенасыщенной темы, я много искал, но так и не нашел четкого ответа на эту конкретную очевидную - imho - важную, проблему:
При преобразовании byte[] в String с использованием UTF-8 каждый байт (8 бит) становится 8-битным символом, закодированным UTF-8, но каждый символ UTF-8 сохраняется как 16-битный символ в java. Это правильно? Если да, это означает, что каждый глупый символ Java использует только первые 8 бит и потребляет вдвое больше памяти? Это тоже правильно? Интересно, как это расточительное поведение приемлемо..
Нет ли какой-нибудь хитрости, чтобы иметь псевдостроку, которая является 8-битной? Действительно ли это приведет к меньшему потреблению памяти? Или, может быть, есть способ сохранить> два 8-битных символа в одном 16-битном символе java, чтобы избежать этой траты памяти?
спасибо за любые разъясняющие ответы...
РЕДАКТИРОВАТЬ: привет, спасибо всем за ответ. Я знал о свойстве переменной длины UTF-8. Однако, поскольку мой источник - это 8-битный байт, я понял (очевидно, неправильно), что ему нужны только 8-битные слова UTF-8. Действительно ли преобразование UTF-8 сохраняет странные символы, которые вы видите, когда в CLI делаете «cat somebinary»? Я думал, что UTF-8 просто каким-то образом используется для сопоставления каждого из возможных 8-битных слов байта с одним конкретным 8-битным словом UTF-8. Неправильный? Я думал об использовании Base64, но это плохо, потому что он использует только 7 бит.
вопросы переформулированы: есть ли более разумный способ преобразовать байт во что-то String? Возможно, самым любимым было просто преобразовать byte[] в char[], но тогда у меня все еще есть 16-битные слова.
дополнительная информация о прецедентах:
Я адаптирую Jedis (java-клиент для NoSQL Redis) в качестве "примитивного уровня хранения" для hypergraphDB. . Итак, jedis — это база данных для другой «базы данных». Моя проблема в том, что мне приходится все время кормить джедаев данными byte[], но внутренне >Redis‹ (фактический сервер) имеет дело только с «двоично-безопасными» строками. Поскольку Redis написан на C, char имеет длину 8 бит, AFAIK, а не ASCIII, который составляет 7 бит. Однако в джедаях, мире java, каждый символ имеет внутреннюю длину 16 бит. Я не понимаю этот код (пока), но я полагаю, что jedis затем преобразуют эти 16-битные строки Java в 8-битную строку, соответствующую Redis (([здесь] [3]). Он говорит, что расширяет FilterOutputStream. Я надеюсь обойти преобразование строки byte[] ‹-> в целом и использование этого Filteroutputstream...? )
теперь я задаюсь вопросом: если бы мне приходилось все время преобразовывать byte[] и String с размерами данных от очень маленьких до потенциально очень больших, не будет ли огромной тратой памяти, чтобы каждый 8-битный символ передавался как 16-битный в java ?