Java-сокеты: InputStream.read () против BufferedReader.read () - PullRequest
3 голосов
/ 11 октября 2009

Я читаю из Socket's InputStream. Поскольку я анализирую входящие данные на лету, я должен читать символ за символом.

Имеет ли BufferedReader.read() то же самое, что и InputStream.read()? (при условии, что BufferedReader был создан с InputStream в качестве основы)

Более эффективно использовать InputStream.read () при чтении каждого символа отдельно? Или есть способ получше?

Ответы [ 2 ]

5 голосов
/ 11 октября 2009

BufferedReader будет читать несколько символов из базового Reader. InputStream предоставляет байты. Таким образом, они работают над 2 различными типами данных. Как вы оборачиваете Reader вокруг Stream? Предположительно вы идете что-то вроде:

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

В этом случае я бы осторожно указал кодировку вашего символа.

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

0 голосов
/ 19 декабря 2016

Метод read () класса InputStream является абстрактным методом. Это должен быть InputStreamrReader, я думаю. Возвращаясь к вашему вопросу, оба метода read () класса InputStreamReader и класса BufferesReader делают одно и то же - возвращают значение ascii символа, единственное отличие состоит в том, что BufferedReader использует то, что называется буферизацией, что позволяет нам уменьшить частоту чтения из диск / STDIN путем копирования чанков в основную память, где при использовании InputStreamReader каждый вызов read () может привести к чтению байтов с диска / STDIN, преобразованию в символы и их возврату, что может быть очень неэффективным.

...