黑马程序员技术交流社区
标题:
关于InputStream与BufferedInputStream的一点疑惑
[打印本页]
作者:
小黑子
时间:
2014-9-29 08:59
标题:
关于InputStream与BufferedInputStream的一点疑惑
本帖最后由 小黑子 于 2014-9-29 13:24 编辑
BufferedInputStream与InputStream到底有什么不同呢?
我理解的是,Buffered就是增加了缓冲区的功能。可是InputStream中有个 int read(byte[] b)方法,
完全可以通过自定义一个字节数组实现缓冲区啊?难道BufferedInputStream的意义就在于把这个字节数组封装了???
作者:
ζ_____________
时间:
2014-9-29 09:42
没错 ! 就是这个把字节数组封装到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
}
}
作者:
Fightin黑马
时间:
2014-9-29 10:41
这是一种包装设计模式,目的就是为了简化代码,其实你看源码的话,buffered里面是封装了一个1024*8的字节数组的
作者:
a986875894
时间:
2014-9-29 11:00
装饰设计模式啦
作者:
小黑子
时间:
2014-9-29 13:23
ζ_____________ 发表于 2014-9-29 09:42
没错 ! 就是这个把字节数组封装到Buffered中的缓冲机制.
这样的好处就是避免了按照一个字节一个字节的对硬 ...
SO GA ,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2