没错 ! 就是这个把字节数组封装到Buffered中的缓冲机制.
这样的好处就是避免了按照一个字节一个字节的对硬盘进行读取,
而是按照一个数组的长度为一组对该文件(硬盘上的数据)进行按字节读取.
我们来看一下模拟该机制的实现方法:
class MyBufferedInputStream
{
private InputStream in; //声明一个读取流
private int pos=0,count=0; //声明一个数组脚标指针以及计数器.
private byte[] buf = new byte[1024]; //创建一个byte型的长度为1024的数组
MyBufferedInputStream(InputStream in) //构造函数中进行对象的传递
{
this.in = in;
}
//一次读一个字节,从缓冲区(字节数组)中获取.
public int myRead()throws IOException //完成缓存的函数机制开始
{ //通过in对象读取硬盘上的数据,并存储到buf中.
if (count == 0) //意思是,如果所操作的指针为0就开始让该数组重新读取文件一次.并且将计数器清零.
{
count = in.read(buf); //获取当前 读取流 读取字节到数组中的长度(避免了在最后一次读取长度不满的情况下出现非法数据).
pos =0; //将数组的脚标指针清.
if (count < 0) //这步是和上面读取数据到 缓存中的相呼应的, 如果 数据读完了 那么 in.read再读一次的时候返回的肯定是-1,因为数据到结尾了返回的就是-1.
{
return -1;
}
byte byt = buf[pos]; //buf数组重新复位一次后的第一次进行对buf中的值进行读取.(此步是加载后的第一次,源是内存,也就是buf数组.)
pos++; //脚标自增,为了继续取出下一个值.
count--; //计数器递减,为了控制该数组中的有效值.
return byt&0xff; //这个地方就是有关类型自动提升时所涉及到的原理了,这样理解就比较简单里,默认的类型提升是根据该数据的最高位进行补的. 也就是说如果该文件是1111的话,那么默认的补位的情况就一定会将前面都补上1,但是这样就和我们在取到最后时所要判断的-1为返回值表示文件结尾的依据有冲突.
}
else if(count >0) //数组复位后的非第一次的对数组中的数据进行读取.
{
byte byt = buf[pos];
pos++;
count--;
return byt&255;
}
return -1; //为了编译通过, 在if 判断语句的最后返回-1
}
}
|