Лучшая практика для чтения до маркера с сокетами (Java)? - PullRequest
2 голосов
/ 17 сентября 2010

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

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

Ответы [ 2 ]

6 голосов
/ 17 сентября 2010

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

BufferedReader и readLine() НЕ подходят для этого:

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

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

0 голосов
/ 17 сентября 2010

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

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