Я просто пишу простой метод, который считывает данные из общего потока, что означает, что это может быть файл FileStream или NetworkStream, не зная его длины. Я снова читаю поток в байт [] и выталкиваю данные в другой поток или что угодно. Мой вопрос: как я могу заметить, что поток закончен? Я попытался вернуться, когда Чтение метод возвращает 0 - это правильный способ сделать это? Кажется, что это нормально для чтения файлов, но иногда встречаются проблемы для чтения данных из сети.Как я могу сказать, что поток был прочитан до конца?
ответ
Да, вызывая Read
многократно и заканчивая, когда он возвращает 0, это именно тот способ, который можно сделать.
Сетевые потоки в порядке с этим - они будут блокироваться до тех пор, пока не будут получены какие-либо данные или поток не будет отключен. Посмотрите документацию для Stream.Read
:
Возвращаемое значение равно нулю, только если позиция в настоящее время в конце ручья. Реализация будет до тех пор, пока не будет прочитан хотя бы один байт данных , если нет данных . Чтение возвращает 0 только тогда, когда данных больше нет в потоке и больше не ожидается (например, закрытый разъем или конец файла ).
Для сетевых потоков, если Stream.ReadByte() возвращает что-либо меньшее, чем 0, вы знаете, что поток был прочитан до конца.
Вы хотите сказать, что я должен поместить вызов метода ReadByte() сразу после метода Read в теле цикла для NetworkStream? –
Как говорит Джон, вы знаете, что это конец файла, потому что он вернет 0 байт. Однако вы также должны учитывать различные исключения, которые могут быть выброшены. Поскольку сеть по своей сути ненадежна, некоторые исключения всегда будут возможны.
Например, если поток отключен (в отличие от другой стороны, просто закрывающей сокет), вы можете получить исключение IOException
. Всегда завершайте вызовы ввода-вывода в обработчиках исключений, если вы абсолютно не уверены, что они не могут генерировать исключение.
Просто потому, что они могут генерировать исключения, это не значит, что вы должны обернуть их обработчиками. По моему опыту, если вызов IO вызывает IOException, метод * make * этот вызов обычно должен просто разрешать исключение. У меня, как правило, очень мало блоков try/catch - обычно чуть выше вершины. –
Я не имел в виду, что ты должен поймать это сразу. Но его нужно поймать в какой-то момент. –
- 1. Как я могу сказать, что ILMerge был использован
- 2. Как убедиться, что поток полностью прочитан?
- 3. Как сказать Camel подождать до конца копии?
- 4. Как заблокировать поток до другого конца
- 5. C++, как читать поток до конца строки
- 6. Как читать поток до конца строки
- 7. Как я могу сказать, что потоки в ThreadPoolExecutor выполнены?
- 8. Как я могу сказать, достиг ли полоса прокрутки до конца содержимого сообщения?
- 9. Что я пытаюсь сказать?
- 10. TransactionScope, как я могу сказать, если Connection был зачислен
- 11. Что я могу сказать об инициализации устройства?
- 12. Как убедиться, что периферийный регистр микроконтроллеров был прочитан
- 13. Могу я сказать, что мой браузер отображает страницу, как если бы я был в другом регионе?
- 14. Как я могу сказать Swashbuckle, что содержание тела требуется?
- 15. Как вы можете с уверенностью сказать, что пакет TCP/IP был получен с другого конца?
- 16. Почему нет, если поток продолжается до конца?
- 17. Отметьте файл .CSV, если он был прочитан
- 18. Android - Как я могу сказать, что apk был подписан с моим ключом
- 19. Как я могу сказать, что я компилирую на Mac?
- 20. Как я могу сказать «центр безопасности Windows», что я «антивирус»?
- 21. Как обеспечить, чтобы весь буфер трубы был прочитан?
- 22. Могу ли я закрыть узел readStream до конца?
- 23. Как я могу найти, где был прерван поток?
- 24. JQuery - когда нажата кнопка, как я могу сказать, что функция работает/занята, и как я могу сказать, что функция выполнена?
- 25. Как я могу отказаться от IEnumerator без итерации до конца?
- 26. Как я могу выполнить запрос WCF от начала до конца?
- 27. Как я могу выровнять стек до конца SRAM?
- 28. Как я могу безопасно нажать DIV до конца
- 29. Как я могу конкатенировать до конца маршрута с помощью Laravel?
- 30. Как я могу сделать эту границу до конца CSS
Я стою исправленный, спасибо. – JoshBerke
Тогда кажется, что нам нужно знать длину данных для сетевого потока? –
Знание длины помогает, но это не обязательно. –