流本身不支持回退功能,想要能够pushback 显然必须能够缓存数据 pushbackinputstream内部维护了一个字节数组 |
不要想当然的认为,类似bufferedinputstream,内部缓冲了一个数组,所有的数据都要经过这个缓冲区,然后对他做处理
他内部维护的缓冲区,仅仅保存pushback的字节
|
还需要注意的是他的内部缓冲区是从后往前写入的,也就是下图中的,从右往左 下标索引大的先写入 一旦写满, 会抛出异常 throw new ioexception("push back buffer is full"); |
推回一个字节 由于是从最后开始,一旦pos等于0也就是到了最前面,就无处可放了 所以抛出异常 否则,就在前面写入一个 |
推回 指定字节数组b 从off偏移量开始的len个字节 推回len个长度,既然是从后往前设置数据,那么pos的值就是可用 空间 的个数 如果空间不够,抛出异常 否则,pos直接向前移动到指定位置 然后借助于system.arraycopy 将b 便宜量off开始拷贝到 |
是unread(byte[] b, int off, int len)的简化形式 用于拷贝整个数组 |
从unread可以清晰的看出来 内部的缓冲区,只是为了给被回退掉的数据使用的 每次回退就是在最前面(下表索引较小的位置) 写入数据 |
只要明确了unread以及内部缓冲区的存放形式即可很清楚的知道read的工作方式了 |
既然是从最后开始往前依次存放,初始时 pos == buf.length 那么但凡有数据,pos必然,小于buf.length 也就是说,读取一个字节时,如果回退缓冲内有数据,直接返回一个字节 否则,调用父类的read方法,而父类filterinputstream 只是简单的 封装转发请求 实际上就是直接使用内部的inputstream进行处理 |
多参数的read方法,将数据写入到指定的字节数组b中 回退缓冲区中有效字节个数为avail = buf.length - pos; 如果缓冲区中有数据,那么将首先从回退缓冲区中读取数据 如果读取的字节数少于 len 个字节,那么它将从底层输入流中读取字节 |
pushbackinputstream 不支持标记点相关的操作 |
如对本文有疑问, 点击进行留言回复!!
android sdk源码 andoid-21 下的TextUtils.java文本工具类 源码赏析
地理坐标(WGS84),投影坐标下(Mercator)切片系统的计算Java类
荐 JavaWeb~简单认识以太网、MAC地址、MTU机制、ARP协议、DNS协议
HUAWEI MH5000-31 LGA Module Hardware Guide draft
网友评论