EndOfStream для BinaryReader

BinaryReader не имеет свойства EndOfStream. Безопасно ли использовать следующий код, чтобы проверить, достигнут ли конец потока?

reader.BaseStream.Length>reader.BaseStream.Position

Ответ 1

Это зависит. Существуют различные типы потоков, которые не реализуют свойство Length или Position, вы получите исключение NotSupportedException. Например, NetworkStream. Конечно, если вы используете такой поток, вам действительно нужно знать, как часто вызывать метод BinaryReader.Read(). Итак, да, это прекрасно.

Ответ 2

Самый простой способ, который я нашел, - проверить возвращаемое значение метода BinaryReader PeekChar(). Если он возвращает -1, вы дойдете до конца потока.

Ответ 3

Это не будет работать как общее решение, потому что предполагается, что значение BaseStream поддерживает свойство Length. Многие реализации Stream не делают и вместо этого бросают NotSupportedException. В частности, любой сетевой базовый поток, такой как HttpRequestStream и NetworkStream

Ответ 4

Я заметил, что сравнение Position to Length не работает на StreamReader, даже если базовый BaseStream поддерживает поиск. Кажется, что StreamReader буферизует считывание с BaseStream. Возможно, поэтому StreamReader поставляет свойство EndOfStream, что хорошо, и я хочу, чтобы BinaryReader сделал то же самое.

Проверка этих значений (длина и положение) в базовом потоке рассчитывает на то, что BinaryReader не ведет себя, как это делает StreamReader, т.е. полагается на BinaryReader только для захвата точного количества байтов из BaseStream, необходимого для выполнения вызова метода пользователя. Предположительно, если BinaryReader фактически работает таким образом внутри, поэтому ему не нужно поставлять EndOfStream, но я уверен, что он действительно поставлял его, чтобы я знал, что конец файла правильно обрабатывается для клиентов независимым от реализации способом.

Конечно, читатели не являются потоками, но в отношении конца поведения файла было бы неплохо, если бы был общий интерфейс, который позволял клиентам классов ввода/вывода знать, что A. конец файла является разумной концепцией для основной источник данных и B. когда конец файла возникает, если A разумно.

Ответ 5

Проверьте свойство Streams CanSeek. Если это свойство возвращает true, вы можете сравнить потоки. Длина в потоке. Позиция, чтобы узнать, находитесь ли вы в конце потока. Если это свойство возвращает false, это не сработает.

Для сетевых потоков вам может потребоваться различать конец доступных байтов (клиенту на другом конце еще больше писать, но еще нет), и поток закрывается. Свойство IsConnected для базового Tcp-соединения не является надежным для того, чтобы знать, когда поток закрыт. Можно перечислить соединения, которые есть у компьютера, и посмотреть, является ли поток, который вы используете, среди них. Это более надежный, но более сложный. Может быть, лучше просто обрабатывать IOExceptions, когда вы не можете читать какие-либо

Ответ 6

То, что я всегда делал в прошлом, и я никогда не видел проблемы с ним. Используемый код использовался в производственной среде в течение 2 лет.