功能简介数组
BufferedInputStream 和 BufferedOutputStream同样,他们都是过滤流缓存
装饰器模式下具体的装饰类性能
用来装饰InputStream以及OutputStream下的其余的具体的实现类测试
好比FileInputStreamspa
BufferedInputStream 和 BufferedOutputStream对象 都是在内部借助于字节数组,来实现缓存的索引 |
BufferedInputStreamip
BufferedInputStreamci |
内部使用字节数组对输入流进行缓存资源 |
protected volatile byte buf[]; |
内部的字节数组 可能动态增加,动态增加是借助于建立新数组而后复制,从新指向 |
DEFAULT_BUFFER_SIZE |
默认大小8K 8192 |
private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8; |
缓冲区最大容许大小 |
protected int count; |
有效字节的个数 |
protected int pos; |
buf 数组中读取的下一个字符的下标索引 |
protected int markpos = -1; |
最后一次调用 mark 方法时 pos 字段的值 |
protected int marklimit; |
调用 mark 方法后,在后续调用 reset 方法失败以前所容许的最大提早读取量 就是最多支持的个数 |
buf[]; 用于实际存储字节数组的值 DEFAULT_BUFFER_SIZE 表示默认缓冲区的大小 MAX_BUFFER_SIZE 表示 最大支持的缓冲区大小 这三个字段用于存储缓冲 |
pos 用于记录读取位置 |
markpos / marklimit mark功能使用 |
构造方法
说了不少遍的装饰器模式, 是你还有你 他的使用,必然离不开 InputStream,并且,它内部还会维护一个 InputStream 看下构造方法,若是不指定大小,那么将会使用默认大小 若是指定了大小,只要合法,将会建立字节数组 并且,会调用父类的构造方法,父类FilterInputStream中 in是protected的 |
|
read方法
提供了两个版本的read public int read() public int read(byte[] b,int off, int len) 多参数的read方法将会持续读取尽量多的数据,直到: 已经读取了指定的字节数, 底层流的 read 方法返回 -1,指示文件末尾(end-of-file),或者 底层流的 available 方法返回 0,指示将阻塞后续的输入请求 |
skip /available/mark/reset/markSupported 同InputStream的协议语义 跳过指定个数 获取可用个数 作标记 回到标记点 测试是否支持mark 和reset方法 |
close
虽然并非直接打开资源,可是它涉及到内部的InputStream,因此须要cloase |
BufferedOutputStream
BufferedOutputStream内部也是经过字节数组进行缓存的 count 记录有效字节数 |
|
构造方法也能够设置,初始化大小 若是不设置,默认是8192 |
BufferedOutputStream 内部经过字节数组进行缓存 也就是数据不直接写入磁盘 而是先写入到内部缓冲区中 因此说,flush 方法是必须的,用来执行实际写入的操做 它的内部借助于flushBuffer方法 方法实现很简单,只要有有效字节,就把有效字节经过内部的out对象写入,而后count清0 清零了就能够继续从头写了 |
|
write方法
单参数write 一旦缓冲区满了 直接所有调用底层out写入 而且重头开始缓存 |
|
三参数write 将数组b 从off偏移量开始,写入len长度到流中 若是len大于缓冲区长度 将全部数据写入,刷新缓冲区 而且直接调用底层out的write 也就是不缓冲了 若是len长度没有超过缓冲区大小 但是 内部缓冲区空间不足够了 刷新缓冲区 最后将参数字节数组的数据, 拷贝到缓冲区 |
|
总结
既然是缓冲装饰器流
因此,它内部要维护一个InputStream或者OutputStream
另外,既然提供了缓冲的功能,经常使用的缓冲功能天然是数组的形式
对于他们两个就是字节数组
他们内部就是都维护了一个字节数组
BufferedInputStream 会将内部底层的流读取的数据,存入到他的缓冲区中,经过BufferedInputStream提供读取功能
BufferedOutputStream 会将写入的数据,存入到他的缓冲区中,在须要的时候,在借助于内部底层的流进行真正写入
缓冲的功能,减小了跟底层磁盘直接交互的io次数,因此说,天然可以提升性能