В чем разница между вызовами Read() и ReadBlock() в TextReader?
Название более или менее говорит само за себя. Звонки документированы:
Здесь для TextReader.Read Method (Char[], Int32, Int32)
а также
Здесь для TextReader.ReadBlock()
с теми же типами аргументов.
Я хочу извлечь часть байтового массива, для которого я составляю MemoryStream
что я намерен читать с StreamReader
вот так:
StreamReader r = new StreamReader(new MemoryStream(rawData, 0, 184, false, false));
r.Read.....
Какой я должен использовать? Один из них быстрее или лучше?
1 ответ
Если вы можете сделать что-то полезное с частичным результатом, тогда вызовите Read() и поработайте над тем, что вы получите. В частности, если вы просматриваете и работаете с результатом каждого Read(), делайте это, а не с ReadBlock().
Слово "блок" в ReadBlock относится к действию блокировки, а не к следующему "блоку" байтов. Таким образом, он будет вынужден остановить дальнейшее выполнение до его завершения.
Если вы используете Reflector для просмотра реализации StreamReader.ReadBlock (которая унаследована от TextReader.ReadBlock), все, что он делает, это делает несколько вызовов метода "Read", пока либо метод "Read" не вернет 0, либо мы не прочитаем как много байтов по запросу. Это необходимо, потому что метод "Read" не обязательно вернет столько байтов, сколько вы просили.