黑马程序员技术交流社区
标题:
MyBufferedInputStream不理解
[打印本页]
作者:
康大玮
时间:
2012-6-9 12:58
标题:
MyBufferedInputStream不理解
import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0,count = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
public int myRead()throws IOException //这个方法不理解
{
if(count==0)
{
count = in.read(buf);
if(count<0)
return -1;
pos = 0;
byte b = buf[pos];
count--;
pos++;
return b&255;
}
else if(count>0)
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
作者:
唐志兵
时间:
2012-6-9 13:03
我也没看明白
作者:
陈嘉宾
时间:
2012-6-9 13:16
本帖最后由 陈嘉宾 于 2012-6-9 13:32 编辑
count为0就往数组里面存数据,我理解的count代表一个计数器的功能取数据个数或长度,然后[pos]取数据代表指针,计数器计算数据个数,如果数据个数减少,那么代表着指针增加就是取得个数就是增加,然后循环这个方法,都取完后count=0了pos也要归0就是循环取。取到结尾没有数据了再取得时候count值就为负了,所以返回-1结束
作者:
赵兵锋
时间:
2012-6-9 14:12
public int myRead()throws IOException //这个方法不理解
{
if(count==0)//count初始值为0
{
count = in.read(buf);//读一次,将读到的字节数赋予count,同时将读到的数据放进buf里,count最大值为1024*4
if(count<0)//如果没有读到数据
return -1;//返回-1
pos = 0;//后面会将buf里的字节一个一个取出,这里的pos便是每次取出字节的下标,这里为0,表示从第一个开始取
byte b = buf[pos];//将buf中下标为pos的字节取出,此处取出的是buf[0]
count--;//count是buf数组里有效的字节数,刚取出了一个字节,所以这里的count要减一
pos++;//pos表示buf里下一个要读的字节下标,每次取出后,要向后移一个,故加一
return b&255;//将取出的字节返回,与255相&是因为b有可能会被解释成负数。
}
else if(count>0)//count>0表示buf里还有需要取出的字节
{
byte b = buf[pos];//将当前pos位置的字节取出
count--;//同样,buf里可取的字节数减一
pos++;//同样,下一个待取的字节位置向后移一个
return b&0xff;//返回刚取出的字节
}
return -1;
}
复制代码
注意,当byte转int时,必须先&255或0xff,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111,即0xffffffff,但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。
作者:
邓杰
时间:
2012-6-9 14:18
import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0,count = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
public int myRead()throws IOException //这个方法不理解
{
if(count==0)
当count为0时。表示里面的数据被取完。然后下的代码再往里面存数据;
{
count = in.read(buf);
//以in对象读取硬盘上的数据;并存储到buf中;
if(count<0)//
当count小于0时。表示目标沼数据已经被取完
;
程序结束;
return -1;
pos = 0;//第二次循环的时候还是从0开始取数据;
byte b = buf[pos];
//第一次取0角标元素;
count--;//
每取一次,count中的数据减一个;
pos++;//
第二次就要取pos++角标的元素;
return b&255;//&255是为了把b前面三个字节用0补全;
}
else if(count>0)//
当count里大于0时,就需要再存储数据。直接取就是了
;
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
希望你这下你可以看的懂,不行的话可以看看毕老师的IO流19天;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2