2015-10-04 3 views
-2

im пытается прочитать информацию, отправленную для клиента на android, используя протокол TCP. В моем сервере у меня есть следующий код:Какой лучший метод для чтения байта из TCP SERVER?

InputStream input = clienteSocket.getInputStream(); 
int c = input.read(); 

с будет containt на ascci номер, который клиент посылает.

Я также могу получить это, написав следующий код:

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

Я хотел бы знать, в чем разница между этими двумя методами.

+0

Вам нужен только _a_ (один) байт от клиента или всего, что находится в потоке? –

+1

(a) Определите «лучший». (б) Вы понимаете, что один дает вам байт, а другой - символ? (c) Вы перепутали «с клиента» и «с сервера», а не то, что это делает малейшую разницу. – EJP

ответ

1

Буферизованный подход лучше, потому что (в большинстве случаев) уменьшает количество системных вызовов, которые JVM необходимо выполнить в операционной системе. Поскольку syscalls относительно дороги, буферизация обычно дает вам лучшую производительность.


В вашем конкретном примере:

  • Каждый раз, когда вы звоните c.read() на входной поток вы делаете системный вызов.
  • В первый раз, когда вы делаете c.read() (или другую операцию чтения) в буферизованном входном потоке, он считывает несколько байтов в байтовый массив в памяти. Во втором, третьем и т. Д. Вызовы c.read(), чтение, как правило, возвращает байты из буфера в памяти без создания системного вызова.

В вашем примере единственный случай, когда использование буферизованного потока не помогает, если вы собираетесь читать только один байт из сокета, а затем закройте его.


UPDATE

Я не заметил, что вы сравнивали небуферизованный InputStream буферного >>Reader < <. Как отмечает @EJP, это «сравнение яблок и апельсинов». Функциональность двух версий отличается. Один читает байты, а другой читает символы.

(И если вы не понимаете, что различие ... и почему это важно различие ... вы бы посоветовали прочитать урок Java Учебник по Basic I/O. В частности, разделы на потоки байтов , символьные потоки и буферизованные потоки.)

0

Вы сравниваете яблоки и апельсины здесь.

  • Ваш первый пример читает один байт из потока, небуферизованный и возвращает значение этого байта. (Добавление «ASCII-номера» к этому не добавляет никакой фактической информации.)
  • Ваш второй пример устанавливает буферизованный считыватель, который может читать символы из потока, буферизованные, но на самом деле ничего не читает.

Вы могли бы создать еще два примера:

InputStream is = new BufferedInputStream(socket.getInputStream()); 
int c = is.read(); 

Это считывает байт, с буферизацией.

Reader reader = new InputStreamReader(socket.getInputStream(); 
int c = reader.read(); 

Это читает символ, с небольшим количеством буферизации: не так много, как BufferedReader обеспечивает.

Реалистичный выбор между двумя буферизованными версиями по соображениям эффективности, описанным в @StephenC, и выбор между ними продиктован тем, хотите ли вы байтов или символов.