|
Заблокирован
|
|||
StreamReader отличие методов чтения Read и ReadBlock21.08.2024, 15:16. Показов 906. Ответов 8
В чем конкретно различие механизмов работы методов? Что именно блокируется в ReadBlock по сравнению с Read?
Читал, что блокирующий метод применяется в случае, если поступление данных в поток может задерживаться (сетевой поток) и т.п. Из описания в док не понял чем конкретно методы отличаются. Там написано про метод Read:
И как метод различает где конец файла, а где конец потока? Если речь о чтении файла на ПК, то StreamReader сформирует поток на основе файла и тут нет никакой разницы между концом файла и концом потока. То есть, в этом случае явно нет никакого смысла в ReadBlock? Так? А если StreamReader создаётся на основе другого потока, в котором могут быть задержки, то лучше (обязательно надо?) использовать ReadBlock? ReadBlock проверяет в какой позиции находится исходя из Stream.Length и если не в последней, то ждёт окончания потока? А у Read, что, другая логика?
0
|
|||
| 21.08.2024, 15:16 | |
|
Ответы с готовыми решениями:
8
Ошибка чтения int из файла через StreamReader.Read()
|
|
2393 / 1920 / 763
Регистрация: 27.07.2012
Сообщений: 5,561
|
||
| 21.08.2024, 15:46 | ||
|
0
|
||
|
|
||||||
| 21.08.2024, 16:14 | ||||||
Сообщение было отмечено titan4ik как решение
Решение
- у нас самый базовый Stream, поверх которого навесили StreamReader может возвращать через Read очень мелкими частями. Например если это NetworkStream с очень малым MTU и буфером, либо считываем очень большой кусок текста из файловой системы с малым кластером - просто вызов Read вернет первый блок и завершит работу. Грубо говоря запросили 10к символов, записало первые 100 и вернуло только их. - ReadBlock будет пытатья вычитать, пока не придет четко указанный count либо не поймем что дочитали до конца (внетренний Read вернет 0). Грубо говоря если в базовом потоке есть 10к символов, то мы таки их вычитаем все за один вызов. Технически ReadBlock избавляет нас от необходимости самим писать обертку над чтением явно известных блоков по длине. Но это опасно зависанием чтения, в случае когда ожидаем блок длины N, но по факту приходит N минус k, и при этом внетренний Stream не сигнализирует об окончании потока (тот же NetworkStream).
2
|
||||||
|
Администратор
|
||||||||
| 21.08.2024, 16:21 | ||||||||
|
Добавлено через 20 секунд
0
|
||||||||
|
Заблокирован
|
||
| 21.08.2024, 16:37 [ТС] | ||
|
А Read прекращает свою работу (тоже код посмотрел, не думал.что он такой простой) как только символы заканчиваются (те, что в наличии уже). То есть поток ещё не закончен, а символы все прочитаны. И метод вернёт "-1". Понял. Да, всё просто оказалось. Спасибо, Wolfdp! Выходит, что проще исходный код смотреть, чем в доки вчитываться и гуглить)
0
|
||
|
|
||||||||
| 21.08.2024, 16:39 | ||||||||
|
Не по теме:
titan4ik, Ради наглядности
1
|
||||||||
|
Заблокирован
|
||||||||
| 21.08.2024, 16:51 [ТС] | ||||||||
|
Первое да - надо смотреть исходники (для уточнения и понимания документации, как в данном случае). Посмотрел и всё стало абсолютно прозрачно и определённо. А если бы ума хватило сразу глянуть, то и вопроса бы не было. Но удивило, что вопрос гуглился плохо. Было много объяснений и рассуждений, а код исходный никто не догадался привести))) Второе да - не использует длину потока. Добавлено через 6 минут и для полноты инфы код метода Read
0
|
||||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
|
|
| 21.08.2024, 17:52 | |
|
0
|
|
|
Заблокирован
|
|||||||
| 21.08.2024, 18:20 [ТС] | |||||||
|
В коде метода Read(char[] buffer, int index, int count) метод Read() ведь это просто возврат -1? Как же тогда это работает? Ведь цикл сразу завершится.
Это я запутался в исходниках. Это же исходники TextReader (абстрактный класс) ОК. Понятно!)
0
|
|||||||
| 21.08.2024, 18:20 | |
|
Помогаю со студенческими работами здесь
9
Переобразование StreamReader->Read() в тип int
После чтения StreamReader'ом, его методом ReadLine, вернуться к предыдущей строке
отличие методов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 11.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|