A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 ぺ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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

3 个回复

倒序浏览

      
  •         {
  •         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]这个单元不存在,就越界了。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报

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而已的

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马