Что делает метод FillBuffer BinaryReader?

Согласно документации:

Заполняет внутренний буфер указанным количеством байтов, считанных из потока.

Что это значит (какой внутренний буфер?)?


person Alofons    schedule 17.10.2010    source источник


Ответы (3)


BinaryReader имеет внутренний буфер, поэтому ему не нужно выполнять столько небольших операций чтения в базовом потоке, особенно при чтении символьных данных, которые могут потребовать некоторого просмотра вперед. Вам не нужно вызывать это вручную.

person Lucero    schedule 17.10.2010
comment
Поэтому мне интересно, почему он защищен, а не частный. - person Alofons; 18.10.2010
comment
Вы не одиноки: pcreview.co.uk/forums/thread-1225604. php - я думаю, они сначала хотели упростить расширение, а затем остановились на полпути или не отменили все. - person Lucero; 18.10.2010

Обратите внимание, что метод объявлен как защищенный.

Таким образом, это представляет интерес только в том случае, если вы хотите создать класс, наследуемый от BinaryReader., что редко требуется делать.

person Lasse V. Karlsen    schedule 17.10.2010
comment
... но даже тогда это довольно бесполезно, потому что у вас нет никакого контроля над внутренним буфером, даже при переопределении этого метода. В этом я согласен с Алофонсом. - person Lucero; 18.10.2010
comment
Согласен, смысла особого нет. Я бы подумал, что было бы полезно иметь возможность вызвать это до того, как вы прочитаете большой объект, состоящий из множества более мелких частей, гарантируя, что на полпути чтения объекта ему не придется заполнять буфер, и, таким образом, вы могли бы предварительно -загрузить буфер. Однако, как вы говорите, у вас нет контроля над размером буфера или чем-то еще, поэтому, скорее всего, это артефакт того, что кто-то думает, что класс должен быть расширяемым, а затем не выполняет работу. - person Lasse V. Karlsen; 18.10.2010

Похоже, главная цель здесь — дать вам удобный способ убедиться, что у вас есть блок данных локально; например, при чтении «двойного» вам (обычно) нужно 8 байтов. Этот метод завершает:

  • проверка, достаточно ли уже внутреннего буфера
  • зацикливание на «Читать» по мере необходимости
  • проверка на EOF (и ошибки)
  • охрана от захвата
  • обработка управления буфером, например периодическое блочное копирование данных в обратном направлении или обработка различных индексов для циклического буфера

Однако маловероятно, что вам нужно будет вызывать его извне, если только вы не читаете небольшой «байт []».

Что касается внутреннего буфера; просто, при десериализации вас:

  • хотите свести к минимуму вызовы «Читать»
  • часто нужно заглянуть вперед более чем на 1 байт (сложно без буфера)
  • регулярно требуются операции с небольшими «байтами []» (например, через BitConverter)

Так что просто работай

person Marc Gravell    schedule 17.10.2010
comment
Я знаю, что это немного старый пост, но не могли бы вы уточнить, что вы имеете в виду в этом последнем списке? Я пишу EndianAwareBinaryReader и часто вызываю в нем BitConverter. См. мой пост в в этом MSDN form для моей реализации. - person Scott Chamberlain; 31.10.2011
comment
@Scott, как вы знаете, byte[] преобладает в BitConverter. Все, что я хочу сказать, это то, что было бы хорошо минимизировать эти ассигнования. На самом деле, в моем собственном сериализаторе я стараюсь избегать BitConverter, используя комбинацию сдвигов и т. д., чтобы обеспечить безопасность байтов, и избежать выделения буфера. - person Marc Gravell; 31.10.2011