2016-07-27 8 views
0

Я перед любопытной проблемой. Некоторый код лучше, чем длинная история:Почему размер приемника String меньше первоначального размера ByteArrayOutputStream при вызове toString()

ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
buffer.write(...); // I write byte[] data 
// In debugger I can see that buffer's count = 449597 
String szData = buffer.toString(); 
int iSizeData = buffer.size(); 
// But here, szData's count = 240368 
// & iSizeData = 449597 

Так что мой вопрос: почему szData не содержит все данные этого буфера? (только один поток запускает этот код), потому что после такого рода операций я не хочу szData.charAt (iSizeData - 1) сбой!

EDIT: szData.getBytes(). Длина = 450566. Я думаю, что есть проблемы с кодированием. Лучше использовать байт [] вместо строки?

+0

Многобайтовые символы, возможно? – Shark

+1

@Shark Не возможно, определенно: http://stackoverflow.com/questions/16270994/difference-between-string-length-and-string-getbytes-length –

+0

@JozefChocholacek О, я уверен, что это * определенно *, но без OP, отправляющий байты/символы, я могу только догадываться. – Shark

ответ

1

В Java, charbyte, в зависимости от кодировки по умолчанию для платформы, char может занимать до 4 байтов в памяти. Вы работаете либо с байтами (двоичные данные), либо с символами (строками), вы не можете (легко) переключаться между ними.

Для строковых операций, таких как strncasecmp в C, используйте методы класса String, например. String.compareToIgnoreCase(String str). Также ознакомьтесь с классом StringUtils от библиотеки Apache Commons Lang.

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

  • Нет связанных вопросов^_^