黑马程序员技术交流社区
标题:
自定义缓冲区的read方法时有不懂的地方
[打印本页]
作者:
ぺsimon☆
时间:
2013-4-30 11:13
标题:
自定义缓冲区的read方法时有不懂的地方
本帖最后由 ぺsimon☆ 于 2013-5-1 19:11 编辑
<div class="blockcode"><blockquote>
/*
这是自己做的字节流缓冲区read方法
*/
import java.io.*;
class MyBufferedInputStream //extends InputStream
{
private InputStream fis;
byte[] b=new byte[1024]; //定义一个byte类型的数组
int pos=0;
int count=0;
MyBufferedInputStream(InputStream fis)//构造函数初始化
{
this.fis=fis;
}
public int myRead()throws IOException//创建一个缓冲区读字符的方法
{
if(count==0)
{
//利用FileInputStream的read方法,从硬盘读一批数据存到数组里
count=fis.read(b);
if(count==-1)
return -1;
pos=0; //从硬盘读一批数据存到数组,让pos归零
byte b1=b[pos];
pos++;
count--;
return b1&255;
}
else if(count>0)
{
//byte b1=b[pos];
pos++;
count--;
/*
*****
问题:为什么这里写return b[pos]&255;会报角标越界异常?谢谢
******
*/
return b[pos]&255;
}
return -1;
}
public void myClose()throws IOException //创造关闭资源的方法
{
fis.close();
}
}
class MyBufferedDemo
{
public static void main(String[] args)throws IOException
{
//定义一个读取字节的输入流对象文件
FileInputStream fis=new FileInputStream("1.jpg");
//定义一个输出字节的流对象文件
FileOutputStream fos=new FileOutputStream("3.jpg");
//创建一个自定义的缓冲区对象
MyBufferedInputStream mbf=new MyBufferedInputStream(fis);
int num=0;
while((num=mbf.myRead())!=-1)
{
fos.write(num);
}
mbf.myClose();
fos.close();
}
}
复制代码
作者:
郭军亮
时间:
2013-4-30 12:08
{
if(count==0)
{
//利用FileInputStream的read方法,从硬盘读一批数据存到数组里
count=fis.read(b);
if(count==-1)
return -1;
pos=0; //从硬盘读一批数据存到数组,让pos归零
byte b1=b[pos];
pos++;
count--;
return b1&255;
}
else if(count>0)
{
//byte b1=b[pos];
pos++;
count--;
/*
*****
问题:为什么这里写return b[pos]&255;会报角标越界异常?谢谢
******
*/
return b[pos]&255;
}
原因在于上面代码第11行,你已经pos++了,但是在第20行中你没有从里面取值就有pos++了,使得一下子跳了两个元素,当pos=1022时,第12行和第20行都进行了pos++,此时pos=1024,但是b[1024]这个单元不存在,就越界了。
作者:
何锦权
时间:
2013-4-30 12:08
else if(count>0)
{
//byte b1=b[pos];
pos++;
count--;
/*
*****
问题:为什么这里写return b[pos]&255;会报角标越界异常?谢谢
******
*/
因为是先pos++,再写return b[pos]&255,
那么当count减到为0的时候,pos就会增加到为1024了, 1024大的数组,最大的下标就是1023而已的
作者:
黄玉昆
时间:
2013-4-30 23:18
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2