BufferedReader будет читать несколько символов из базового Reader. InputStream предоставляет байты. Таким образом, они работают над 2 различными типами данных. Как вы оборачиваете Reader вокруг Stream? Предположительно вы идете что-то вроде:
BufferedReader in
= new BufferedReader(new InputStreamReader(socket));
В этом случае я бы осторожно указал кодировку вашего символа.
С точки зрения оптимизации, было бы лучше использовать BufferedReader, поскольку он будет считывать несколько килобайт одновременно, и вы можете взять каждый символ, когда захотите (необязательно форсировать новое чтение ввода-вывода).