class io.BufferedIOBase
是支持某些缓冲区的二进制流的基类。它继承自IOBase,没有公共的构造器。和RawIOBase主要的区别在于,方法read(),readinto()和write()会尽可能(分别)的多读所请求的输入或者尽可能的输出所有给定的输出,以牺牲多个系统调用为代价。
另外,如果底层原始流处于非阻塞模式并且无法获取或提供足够的数据时,那些方法可能会引发BlockingIOError错误;和RawIOBase不同的是,他们永远不会返回None。
此外,read()方法没有一个按照readinto()的默认实现。
典型的BufferedIOBase的实现不应该继承自RawIOBase实现,但是wrap部分,比如BufferedWriter和BufferedReader却是继承自RawIOBase的实现。
BufferedIOBase提供或者重写了从IOBase中继承来的属性和方法。
raw:
BufferedIOBase处理的底层原始流,这不是BufferedIOBase的API的一部分,可能在某些实现中不存在。
detach()
将底层原始流从缓冲区中分开并返回
在原始流被分离之后,该缓冲区变为不可用状态
某些缓冲区,比如BytesIO,没有从该方法中返回单个原始流的概念,它们会引UnsupportedOperation。
read(size=-1)
读取并返回至多size大小的字节。如果参数被省略,或者为None,或者为负数,那么读取 直到遇到EOF才停止,并且将数据返回。
如果流中游标已经是EOF处,那么返回的是一个空的字节对象。
如果参数是正数,并且底层原始流不是可交互式的,那么发出多个原始读取操作以读满需要的字节数(除非首先到达EOF)。
但是对于交互式原始流,最大只会发出一个原始读取操作,短的结果并不意味着即将遇到EOF。
如果底层原始流处于非阻塞模式,并且目前没有可用数据,则会引发BlockingIOError错误。
readl(size=-1)
读取并返回至多size大小的字节,最多值只能调用一次预测底层原始流的read()(或者readinto()方法)方法。这将是非常有用的
,如果您在BufferedIOBase对象上实现自己的缓冲区。
readinto(b)
读取字节到一个已经指定大小的,可以写的类字节对象b中,并且返回读取的字节数。
和read()类似,多个读取操作可能被发给底层原始流,除非后者是可交互的。
如果底层原始流处于非阻塞模式,并且目前没有可用数据,则会引发BlockingIOError错误。
readintol(b)
读取字节到一个已经指定大小的,可写的类字节对象b中,最多只能调用一次底层原始流的read()(或者readinto())方法。
返回读取的字节数量。
如果底层原始流处于非阻塞模式,并且目前没有可用数据,则会引发BlockingIOError错误。
write(b)
将给定的类字节对象b写入,并且返回写入的字节数(总等于b的长度(以字节为单位),如果写入失败,则会引发OSError)。
根据实际的实现,这些字节可能正准备写入到底层流中,或者由于性能和延迟原因而被保存在缓冲区中。
当在非阻塞模式下时,如果数据需要写入原始流,但是不使用阻塞又无法接受所有数据时,则会引发BlockingIOError错误。
该方法返回后,调用者可能会释放或者改变b对象,所以在调用该方法期间,实现部分只能访问对象b。