2016-05-18 1 views
1

У меня есть класс обмена сообщениями в моей программе java, который использует только значения String и никогда не содержит никаких данных binary.Есть ли какие-либо данные, потерянные в Java, если я конвертирую двоичные данные в строку и обратно?

Я хочу отправить файл rpm, так что в основном binary данных через этот класс сообщений до receiver.

Я знаю, что это может быть сделано путем преобразования данных binary в String на messaging конца, а затем обратно в binary файл на receiving конце.

Однако мой вопрос, будет ли данные будут потеряны между преобразованием моего binary файла в String затем обратно в binary data сохранить в виде файла binary, или данные будут сохранены через все преобразования?

+0

Это зависит от многого. как вы собираетесь * кодировать * двоичные данные? –

+0

При условии, что вы не используете какую-то экзотическую реализацию, вы ничего не потеряете. Посмотрите, например, на Base64, который позволяет вам преобразовывать массивы байтов в String и наоборот: https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64 .html – Berger

+0

@ElliottFrisch я еще не думал об этой части дизайна, каковы мои варианты? – jgr208

ответ

1

Двоичные данные средства byte[], InputStream, OutputStream. И java использует внутренне Unicode для текста: String, char, Reader, Writer.

Поэтому следует преобразовать только двоичные данные, которые представляют текст, а также указать кодировку, что двоичных данные:

byte[] bytes = ... 
String s = new String(bytes, StandardCharsets.UTF_8); 
bytes = s.getBytes(StandardCharsets.UTF_8); 

Нетекстовых данные не должны быть преобразованы, так как это может быть незаконным для конкретной кодировки , особенно для многобайтовой кодировки UTF-8. Также преобразование в Unicode является ненужной неэффективностью. Например, java char - это два байта (кодировка UTF-16).

Лучшее использование ByteArrayInputStream, ByteArrayOutputStream, ByteBuffer для некоторых целей. Never String. При упряме, затем используйте StandardCharsets.ISO_8859_1.

Смежные вопросы