Как использовать markSupported особенность inputsream java

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

2 ответа

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

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

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

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

Другие вопросы по тегам