黑马程序员技术交流社区

标题: 自定义缓冲区的read方法时有不懂的地方 [打印本页]

作者: ぺsimon☆    时间: 2013-4-30 11:13
标题: 自定义缓冲区的read方法时有不懂的地方
本帖最后由 ぺsimon☆ 于 2013-5-1 19:11 编辑
  1. <div class="blockcode"><blockquote>
  2. /*
  3. 这是自己做的字节流缓冲区read方法
  4. */
  5. import java.io.*;
  6. class MyBufferedInputStream //extends InputStream
  7. {
  8.         private InputStream fis;
  9.         byte[] b=new byte[1024]; //定义一个byte类型的数组
  10.         int pos=0;
  11.         int count=0;
  12.         MyBufferedInputStream(InputStream fis)//构造函数初始化
  13.         {
  14.         this.fis=fis;
  15.         }

  16.         public int myRead()throws IOException//创建一个缓冲区读字符的方法
  17.         {
  18.         if(count==0)
  19.         {
  20.   //利用FileInputStream的read方法,从硬盘读一批数据存到数组里
  21.         count=fis.read(b);
  22.         
  23.         if(count==-1)
  24.         return -1;

  25.         pos=0; //从硬盘读一批数据存到数组,让pos归零
  26.         byte b1=b[pos];
  27.         pos++;
  28.         count--;
  29.         return b1&255;
  30.         }

  31.         else if(count>0)
  32.         {
  33.         //byte b1=b[pos];
  34.         pos++;
  35.         count--;
  36. /*
  37. *****
  38. 问题:为什么这里写return b[pos]&255;会报角标越界异常?谢谢
  39. ******
  40. */
  41.         return b[pos]&255;
  42.         }

  43.         return -1;
  44.         }
  45.         public void myClose()throws IOException //创造关闭资源的方法
  46.         {
  47.         fis.close();
  48.         }
  49.         
  50. }

  51. class MyBufferedDemo
  52. {
  53.         public static void main(String[] args)throws IOException
  54.         {
  55.         //定义一个读取字节的输入流对象文件
  56.         FileInputStream fis=new FileInputStream("1.jpg");
  57.         //定义一个输出字节的流对象文件
  58.         FileOutputStream fos=new FileOutputStream("3.jpg");
  59.         //创建一个自定义的缓冲区对象
  60.         MyBufferedInputStream mbf=new MyBufferedInputStream(fis);
  61.         

  62.         int num=0;
  63.         while((num=mbf.myRead())!=-1)
  64.         {
  65.         fos.write(num);
  66.         }
  67.         mbf.myClose();
  68.         fos.close();
  69.         
  70.         }
  71. }
复制代码

作者: 郭军亮    时间: 2013-4-30 12:08

       原因在于上面代码第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