Как я могу сказать, что поток был прочитан до конца? - PullRequest
1 голос
/ 05 апреля 2009

Я просто пишу простой метод, читающий данные из общего потока - это означает, что это может быть FileStream или NetworkStream без знания длины. Я повторяю чтение потока в байт [] и отправляю данные в другой поток или что-то еще. У меня вопрос, как я могу заметить, что поток закончен? Я пытался вернуться, когда метод Read возвращает 0 - это правильный путь? Кажется, что это нормально для чтения файлов, но иногда возникают проблемы с чтением данных из сети.

Ответы [ 3 ]

5 голосов
/ 05 апреля 2009

Да, повторный вызов Read и завершение после возврата 0 - это абсолютно верный способ сделать это.

Сетевые потоки тоже подойдут - они будут блокироваться, пока не будут получены какие-либо данные или поток не будет отключен. Посмотрите документацию для Stream.Read:

Возвращаемое значение равно нулю, только если позиция в настоящее время в конце поток. Реализация будет заблокировать хотя бы один байт данных можно прочитать, если нет данных доступен. Read возвращает 0 только когда в потоке больше нет данных и больше не ожидается (например, закрытый сокет или конец файла).

0 голосов
/ 05 апреля 2009

Как говорит Джон, вы знаете, что это конец файла, потому что он вернет 0 байтов. Однако вы также должны учитывать различные исключения, которые могут быть выброшены. Поскольку сеть по своей природе ненадежна, некоторые исключения всегда будут возможны.

Например, если поток отключен (в отличие от другой стороны, просто закрывающей сокет), то вы можете получить исключение IOException. Всегда переносите вызовы ввода-вывода в обработчики исключений, если только вы не уверены, что они не могут вызвать исключение.

0 голосов
/ 05 апреля 2009

Для сетевых потоков, если Stream.ReadByte () возвращает значение меньше 0, вы знаете, что поток был прочитан до конца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...