Вероятно, ваша проблема связана с использованием StringBuffer для буферизации ответа.Символ в Java является двухбайтовой сущностью, соответствующей точке символа Unicode.Документация для String # getBytes () гласит:
Возвращает новый байтовый массив, содержащий символы этой строки, закодированные с использованием системной кодировки по умолчанию.
Так что никаких гарантий нетчто байты, которые вы передаете, преобразуются в символы, а затем обратно в байты - это тот же поток, который вы передали в первую очередь.
Я думаю, вам нужно будет кодировать свое решение, используя динамически расширяемый байтовый буфер вместо StringBuffer.
Кроме того, два примечания об использовании StringBuffer:
1) Все обращения к StringBuffer синхронизированы, поэтому вы платите штраф за производительность.StringBuilder - это современная замена, которая не выполняет синхронизацию под капотом.
2) Каждый раз, когда вы добавляете в StringBuffer:
rawResponse.append(new String(responseData, 0, length));
, вы выделяете новую строку и бросаетеэто прочьЭто действительно оскорбительно для сборщика мусора.StringBuffer на самом деле имеет форму append()
, которая будет напрямую принимать массив символов, поэтому нет необходимости использовать промежуточную строку.(Но вы, вероятно, не хотите использовать StringBuffer в первую очередь).