BlackBerry UTF-8 InputStreamReader при выпуске сокета - PullRequest
0 голосов
/ 03 сентября 2011

Я пытаюсь прочитать ответ от сервера, используя сокет, и информация в кодировке UTF-8.Я обертываю InputStream из сокета в InputStreamReader с кодировкой, установленной в «UTF-8».

По какой-то причине кажется, что читается только часть ответа, а затем чтение просто зависает в течение минуты или двух, а затем заканчивается.Если я установлю кодировку для InputStreamReader на «ISO-8859-1», тогда я смогу сразу прочитать все данные, но, очевидно, не все символы будут отображаться правильно.

Код выглядит примерно так:

socketConn = (SocketConnection)Connector.open(url);
InputStreamReader is = new InputStreamReader(socketConn.openInputStream(), "UTF-8");

Затем я читаю заголовки и содержимое.Содержимое разбивается на части, и я читаю строку с размером каждого чанка (конвертируемое в десятичное от шестнадцатеричного), чтобы узнать, сколько читать.

Я не понимаю разницу в чтении с двумя кодировками иэффект, который он может иметь, потому что он работает без проблем с ISO-8859-1 и, в конце концов, работает с UTF-8, есть только большая задержка.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Я уже удалял размеры чанков на лету, поэтому я сделал что-то похожее на ответ IOUtilities.Вместо использования InputStreamReader я просто использовал InputStream.InputStream имеет метод read, который может заполнять массив байтов, поэтому для каждого чанка код выглядит примерно так:

byte[] buf = new buf[size];
is.read(buf);
return new String(buf, "UTF-8");

Это работает, не вызывает задержек, и я могу удалить дополнительную информациюо кусках на лету.

0 голосов
/ 03 сентября 2011

Трудно понять причину задержки.

Вы можете попробовать другой способ получения данных из сети:

byte[] data = IOUtilities.streamToBytes(socketConn.openInputStream());

Я считаю, что вышеупомянутое должно быть передано без задержки,Затем, получив байты из сети, вы можете приступить к обработке данных.Обратите внимание, что вы всегда можете получить String из байтов, представляющих строку в кодировке UTF-8:

String stringInUTF8 = new String(bytes, "UTF-8");

ОБНОВЛЕНИЕ : см. Второй комментарий к этому сообщению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...