(я думаю, ваш пример разбит с точки зрения того, что такое читатель и что такое поток ввода, но я все равно получаю вопрос)
Вы можете делать такие вещи, но вам нужно точно знатькак каждый компонент ведет себя в отношении буферизации.
Поток ввода сокета, с которым вы работаете, позволит вам прочитать определенный байт только один раз (проверка InputStream.markSupported()
).Вы можете обернуть этот входной поток в BufferedInputStream
, который эффективно читает несколько байтов вперед, но также добавляет функциональность для выполнения mark()
и reset()
.
Это означает, что любой поток чтения / ввода поверхBufferedInputStream
может читать вперед, пометить, пропустить назад и т. д. Но здесь вы должны быть осторожны, чтобы не добавлять еще один слой "буферов" - то есть BufferedReader
> InputStreamReader
> BufferedInputStream
> InputStream
.
Таким образом, ответ - да, его можно заставить работать, просто знайте точное поведение каждого компонента (я часто вижу людей, добавляющих BufferedXXX
просто для ада).
В вашем примере я бы сделал:
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
InputStreamReader reader = new InputStreamReader(in, "utf-8"); // consider char encoding
DataInputStream dis = new DataInputStream(in);