Лучшая практика для чтения до маркера с розетками (Java)?

StackOverflow https://stackoverflow.com/questions/3732429

  •  03-10-2019
  •  | 
  •  

Вопрос

Я создаю мобильное приложение для бега на телефоне и пытаться прочитать данные из него наиболее эффективным способом. Приложение отправит данные в мое серверное приложение (в виде байтов, не обязательно символов).

Я не буду знать длину данных; Конец будет отмечен 3 байтовым маркером (т.е. 0x11,0x22,0x33), а затем будет отправлен новый набор данных. Вполне вероятно, что большое количество данных будет отправлено в каждом «наборе» данных. Я задаюсь вопросом, то какой самый эффективный способ прочитать эти данные. Должен ли я использовать InputStreamReader? BufferedReader? Очевидно, мне нужно будет осмотреть каждого персонажа, чтобы увидеть, является ли он частью маркера, и если да, отправьте все данные перед маркером на другой способ обработки.

От того, что я могу сказать, BufferedReader.readLine() будет то, что я хочу если мой конец маркера был \n (Очевидно, это не так). Нужно ли мне написать свой собственный метод читать BufferedReader Байт-байт и искать мой маркер? (Я также не знаю, будет ли это наиболее эффективным образом?)

Это было полезно?

Решение

Предполагая, что ваши данные являются данными байтов, а не данные символов, вы должны обернуть свой входной поток сокета в BufferedInputStream, И используйте это, чтобы прочитать данные один байт за раз, сохранение байтов в байтовом буфере некоторых видов. (Один вариант - использовать ByteArrayOutputStream буфер байтов данных, которые вы прочитали из BufferedInputStream.)

BufferedReader а также readLine() не так, чтобы пойти:

  • Предполагая, что данные не являются символами данных, если вы пытаетесь расширить его в соответствии с некоторыми наборами символов, вы несите ответственность на него.
  • То readLine Метод понимает только линии, разделенные '\n' и / или '\r' персонажи. Там нет способа получить его, чтобы понять другие разделители «линии».

Наконец, обратите внимание, что BufferedInputStream очень важно для поведенческих причин. Если вы не используете один, и читайте из разъема ввода ввода один байт за раз, вы, вероятно, понравится значительный удар производительности из-за количества SESCalls, которые выполняет ваше приложение Java.

Другие советы

Читатель для чтения текста, поэтому вы, вероятно, нужны вместо этого ввода. Потоки, как правило, более эффективны при их буфере их, поэтому используйте BufferedInputStream. И я не знаю о какой-либо встроенной функции для обнаружения маркеров в потоке данных, поэтому вам придется сделать это самостоятельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top