2012-05-08 2 views
3

Название более или менее говорит обо всем. Вызовы задокументированы:В чем разница между вызовами Read() и ReadBlock() на TextReader?

Here для TextReader.Read Method (Char[], Int32, Int32) и
Here для TextReader.ReadBlock() с теми же типами аргументов.

Я хочу, чтобы извлечь часть массива байтов, для которого я Придумайте MemoryStream что я пристальный читать с StreamReader так:

StreamReader r = new StreamReader(new MemoryStream(rawData, 0, 184, false, false)); 
    r.Read..... 

Какой я должен использовать? Является ли один из них быстрее или лучше?

+0

ReadBlock пытается вернуть запрошенное количество байтов. если вы получите меньше, то вы знаете, что попали в конец потока. –

+0

@HansPassant: Кажется разумным, как утверждают другие комментаторы, но где я могу это понять из документации? IHMO, все просто гадают здесь. – Marcel

+2

Я посмотрел код, всегда хороший способ узнать, что он на самом деле делает. Отражатель удобен или просто просматривает справочный источник. –

ответ

5

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

Слово «блок» в ReadBlock относится к действию блокировки, а не к следующему «блоку» байтов. Таким образом, это заставит остановить дальнейшее выполнение до его завершения.

Если вы используете Reflector, чтобы посмотреть на реализацию StreamReader.ReadBlock (который унаследован от TextReader.ReadBlock), все, что он делает, это сделать несколько вызовов метода «Чтение» до тех пор, пока метод «Чтение» не вернет 0 или мы прочитали столько байтов, сколько было запрошено. Это необходимо, потому что метод «Чтение» не обязательно возвращает столько байтов, сколько вы просили.

+0

Спасибо за разъяснение термина «блок». – Marcel

Смежные вопросы