Смысл BufferedIOReader
состоит в том, чтобы сохранить внутренний буфер, и вы устанавливаете размер этого буфера.Этот буфер используется для удовлетворения меньших операций чтения, чтобы избежать многих вызовов чтения на более медленном устройстве ввода-вывода.
Однако буфер не пытается ограничить размер операций чтения!
Из документации io.BufferedIOReader
:
При считывании данных из этого объекта может быть запрошен больший объем данных из базового необработанного потока и сохранен ввнутренний буфер.Буферизованные данные затем могут быть возвращены непосредственно при последующих чтениях.
Объект наследуется от io.BufferedIOBase
, что гласит:
Основное различиеRawIOBase
означает, что методы read()
, readinto()
и write()
будут пытаться (соответственно) прочитать столько входных данных, сколько требуется, или использовать весь заданный вывод за счет выполнения, возможно, более одного системного вызова.
Поскольку вы вызвали .read()
для объекта, большие блоки считываются из обернутого объекта, чтобы прочитать все данные до конца.Внутренний буфер, который содержит экземпляр BufferedIOReader()
, здесь не вступает в действие, вы все-таки запросили все данные.
Буфер вступит в игру, если вы будете читать меньшими блоками:
>>> reader = io.BufferedReader(MyReader(2048), buffer_size=512)
>>> __ = reader.read(42) # initial read, fill buffer
read buffer length: 512
>>> __ = reader.read(123) # within the buffer, no read to underlying file needed
>>> __ = reader.read(456) # deplete buffer, another read needed to re-fill
read buffer length: 512
>>> __ = reader.read(123) # within the buffer, no read to underlying file needed
>>> __ = reader.read() # read until end, uses larger blocks to read from wrapped file
read buffer length: 8192
read buffer length: 8192
read buffer length: 8192