Есть ли способ декодировать данные InputStream в текст без использования Stream Decoder на самом объекте InputStream? - PullRequest
0 голосов
/ 23 апреля 2019

Я сделал прослушиватель Bluetooth InputStream, который проверяет, есть ли входящие данные, просто запросив if(InputStream.isAvailable > 0), затем создал цикл для сохранения входящих данных в int[] до тех пор, пока их больше не будет, и он работает отлично. Я использую простой Log.d логгер для вывода результата. Я все еще новичок и могу понять основные понятия. Текст, который отправляется через мое устройство Bluetooth на мой телефон, - "Hello Android!", но он закодирован в целые числа, и я хотел бы преобразовать int[] в String, чтобы я мог получить закодированный текст без использования Потоковый декодер, но целые числа. Является ли это возможным? Фактический вывод, работающий как задумано, выглядит так: 72, 101, 108, 111, 32, 65, 110, 100, 114, 111, 105, 100, 33, 13, 10,. Конечно, все они приходят не в одно и то же время, потому что они отправляются один за другим, и не о чем беспокоиться, потому что я буду использовать свои собственные разделители для определения начала и конца целых данных.

Мой код:

if(mmInputStream.available() > 0) {

    int[] receivedBytes = new int[1024];
    int i = 0;

    while(mmInputStream.available() > 0) {
        receivedBytes[i] = mmInputStream.read();
        i++;
    }

    String s = "";

    for(int j = 0; j < i; j++){
        s += receivedBytes[j] + ", ";
    }

    Log.d("INPUTSTREAM_DATA", s);

}

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

1 Ответ

1 голос
/ 23 апреля 2019

Ужасный код. НЕ ИСПОЛЬЗУЙТЕ такую ​​функцию чтения одного символа - это крайне неэффективно. Определите размер буфера и используйте версию байтового массива. Затем вы можете преобразовать весь байтовый массив в строку через new String(array, encoding), где encoding - это кодировка ваших данных (UTF-8, UTF-16 и т. Д.).

И не используйте + для конкатенации таких строк: строки являются неизменяемыми, поэтому каждое использование приводит к созданию нового объекта. Вместо этого используйте StringBuilder. Лучший код выглядел бы так (игнорируя требуемую обработку исключений)

int BUFFER_SIZE = 1024;
StringBuilder builder = new StringBuilder();
byte data[] = new byte[BUFFER_SIZE];
while(inputStream.available() > 0) {
   int read = inputStream.read(data);
   builder.append(new String(data, 0, read, "UTF-8"));
}
return builder.toString();
...