BufferedIOReader的重点是保留一个内部缓冲区,并设置该缓冲区的大小。该缓冲区用于满足较小的读取,以避免在速度较慢的I/O设备上进行多次读取调用。在
不过,缓冲区不会限制读取的大小!在When reading data from this object, a larger amount of data may be requested from the underlying raw stream, and kept in an internal buffer. The buffered data can then be returned directly on subsequent reads.
该对象继承自^{},它声明:The main difference with RawIOBase is that methods read(), readinto() and write() will try (respectively) to read as much input as requested or to consume all given output, at the expense of making perhaps more than one system call.
因为您在对象上调用了.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