2013-10-20 4 views
0

У меня есть следующий код:ByteArrayOutputStream.toString() генерируют дополнительные символы

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

int size = 4096; 
byte[] bytes = new byte[size]; 

while (is.read(bytes, 0, size) != -1) 
{ 
    baos.write(bytes); 
    baos.flush(); 
} 

Когда я делаю:

String s = baos.toString(); 

Я получаю \u0000 -s добавляемых к моей строке. Итак, если мои данные персонажа являются только X байтами из Y, Y-Z будет заполняться \u0000, что делает невозможным проверку на equals. Что я здесь делаю неправильно? Как я должен преобразовывать байты в String в этом случае?

Большое спасибо заранее!

ответ

3

Вы должны писать только столько данных, сколько вы читаете в каждый раз через петлю:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

int size; 
byte[] bytes = new byte[4096]; 

while (size = is.read(bytes, 0, bytes.length) != -1) 
{ 
    baos.write(bytes, 0, size); 
} 
baos.flush(); 
String s = baos.toString(); 

Вы могли бы рассмотреть указать конкретный набор символов для преобразования байтов в String. Метод no-arg toString() использует кодировку по умолчанию для платформы.

+0

Спасибо за эту ясную иллюстрацию! – carlspring

4

весь массив (все 4096 байта) записывается на выход - массивы не имеют ни малейшего представления о том, как много «полезной информации» они содержат!

Магазина сколько было чтение в переменный (InputStream.read возвращает полезное число) и указать, что к соответствующей OutputStream.write перегрузке, чтобы писать только часть (т.е. которая содержит полезные данные) массива.

Хотя вышеуказанное изменение должно «исправить» проблему, обычно рекомендуется использовать формы преобразования string<->byte[], которые принимают явный набор символов.

+0

Как тупой, как это будет звучать, не могли бы вы фактически проиллюстрировать его в коде? – carlspring

+0

@carlspring Тед Хопп сделал это для нас обоих в своем ответе :) – user2864740

+0

Спасибо за ваше объяснение! – carlspring

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