Как использовать функцию markSupported для входного потока Java - PullRequest
6 голосов
/ 22 апреля 2009

Я намерен использовать функцию markSupported для проверки первого байта, чтобы проверить формат, а затем сбросить его, скажите, пожалуйста, какой поток следует использовать для связи по протоколу TCP в Java. Для большинства потоков, таких как datainputstream, эта функция не предусмотрена. Пожалуйста, можете дать мне несколько советов, чтобы использовать метку и сброс.

Ответы [ 2 ]

8 голосов
/ 22 апреля 2009

Взгляните на PushbackInputStream , который выглядит так, как будто он создан для того, что вы хотите.

Он обернет существующий поток ввода и позволит вам прочитать байт, а затем вернуть его обратно. Из Javadoc:

PushbackInputStream добавляет функциональность к другому входному потоку, а именно возможность «отодвинуть» или «непрочитать» один байт. Это полезно в ситуациях, когда фрагменту кода удобно читать неопределенное количество байтов данных, которые ограничены определенным байтовым значением; после прочтения завершающего байта фрагмент кода может «прочитать» его, так что следующая операция чтения во входном потоке перечитает байт, который был передан обратно. Например, байты, представляющие символы, составляющие идентификатор, могут заканчиваться байтом, представляющим символ оператора; метод, чья работа состоит в том, чтобы читать только идентификатор, может читать до тех пор, пока он не увидит оператора, а затем отодвинуть оператор назад для повторного чтения.

8 голосов
/ 22 апреля 2009

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

...