黑马程序员技术交流社区

标题: 自定义字节流缓冲区里的小问题 [打印本页]

作者: 付江涛    时间: 2014-7-17 16:28
标题: 自定义字节流缓冲区里的小问题
本帖最后由 付江涛 于 2014-7-17 20:47 编辑

MyBufferedInputStream代码:

import java.io.*;

class MyBufferedInputStream
{
    private InputStream in;

    private byte[] buf=new byte[1024];

    private int pos=0,count=0;
    MyBufferedInputStream(InputStream in)
    {
        this.in=in;
    }
   
    //一次读一个字节,从缓冲区(字节数组)获取。
    public int myRead() throws  IOException
    {
        //通过in对象读取硬盘上的数据,并存储buf中。
        if(count==0)
        {
            count=in.read(buf); //通过count记录数组长度;   read:读取一定数量的字节记入buf数组,但下面只是通过判断读取了0角标元素。
            
            if(count<0)
                return -1;
            pos=0;

            byte b=buf[pos]; //读取0角标元素     
1、

            count--; //因为读取了一个角标元素,所以数组长度--

            pos++; //指针++
     
            return b&255;  
        }

        else if(count>0)
        {
            byte b=buf[pos]; //读取0角标元素

            count--; //因为读取了一个角标元素,所以数组长度--

            pos++; //指针++
     
            return b&0xff;
        }
        return -1;
    }

    public void myClose() throws IOException
    {
        in.close();
    }
}

调用
MyBufferedInputStream:
public static void copy_2() throws IOException
    {
        MyBufferedInputStream bufis=new MyBufferedInputStream(new FileInputStream("c:\\0.mp3"));
        BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\2.mp3"));
        
        int by=0;

        while ((by=bufis.myRead())!=-1)    2
        {
            bufos.write(by);
        }

        bufos.close();
        bufis.myClose();
    }

问题:
为什么我是这样理解的:count=in.read(buf);,通过read方法,读取一定数量的字节存入buf数组,1 中只是读取了角标0的元素。而调用myRead时,循环一次,in.read()循环一次,每次都是获取的角标0的元素。





作者: zhxu188    时间: 2014-7-17 17:07
其实每次循环时并不是每次都取角标0的元素,在第一次循环时,装入了1024个元素,count长度为1024,循环一次count减1,pos加1,然后count= 1023,pos=1,,下次循环时判断count>0;执行byte b=buf[pos];在这句话中pos=1,所以读取的是角标1的元素,而不是想楼主说的角标0的元素。读取完成后,count=1022,pos=2,下次循环时接着判断count>0,接着执行byte b=buf[pos],这时读取的是buff[2]角标为2 的元素,这样一直循环下去直到count=0,这样就把buf数组读取完了,下次循环时就会重新对buf装数据了。楼主是在else if的语句中对byte b=buf[pos];理解错误了
  1. else if(count>0)
  2.         {
  3.             byte b=buf[pos]; //其实读取的并不是0角标元素,而是前面代码自增后的pos的角标元素

  4.             count--; //因为读取了一个角标元素,所以数组长度--

  5.             pos++; //指针++
  6.      
  7.             return b&0xff;
  8.         }
  9.         return -1;
复制代码

作者: 人心如水    时间: 2014-7-17 17:23
本来不懂的,看了你的理解瞬间懂了
作者: 付江涛    时间: 2014-7-17 19:25
zhxu188 发表于 2014-7-17 17:07
其实每次循环时并不是每次都取角标0的元素,在第一次循环时,装入了1024个元素,count长度为1024,循环一次 ...

else if那块是我写错了。我知道那个pos应该是自增后的。

我只是不明白的是,

比如第一次循环,if语句成立,会执行:
if(count==0)
        {
            count=in.read(buf); //通过count记录数组长度;
            
            if(count<0) //暂时忽略此处
                return -1; //暂时忽略此处
            pos=0;

            byte b=buf[pos]; //读取0角标元素     


            count--; //因为读取了一个角标元素,所以数组长度--

            pos++; //指针++
     
            return b&255;  
        }


此时buf数组是1024吧,接下来是bytr b=buf[pos],只获取了角标0的元素。然后长度自减,指针自加,最后返回了b。那剩下的1023元素呢?

接下来再次循环,if条件不满足,然后判断else if,条件满足,执行代码块。。。。
--------------------------------------------------------------------------------------------------------------------------------------
好吧,是自己搞错了,本来没懂,又写疑问的时候突然懂了。原来是 就第一次执行if代码块,后面会一直执行else if代码块,else if代码块就是获取元素、数组长度自减,角标自增,直到条件不满足,返回-1,此时调用myRead()的while循环条件不满足,跳出循环。

OK,,懂了,多谢解答。


作者: 付江涛    时间: 2014-7-17 19:26
人心如水 发表于 2014-7-17 17:23
本来不懂的,看了你的理解瞬间懂了

{:3_46:} 理解能力挺强的哈 我都不知道我说了什么~不过现在终于弄懂了~
作者: yinxjfly    时间: 2014-7-17 20:02
看的我眼花缭乱!
作者: 付江涛    时间: 2014-7-17 20:15
yinxjfly 发表于 2014-7-17 20:02
看的我眼花缭乱!

别看帖子了,确实挺乱的,现在感觉也不能,把自己当做主线程,按流程分析一遍,就明白了
作者: yinxjfly    时间: 2014-7-17 21:02
付江涛 发表于 2014-7-17 20:15
别看帖子了,确实挺乱的,现在感觉也不能,把自己当做主线程,按流程分析一遍,就明白了 ...

看到回帖我更乱了!
作者: 一十二。    时间: 2014-7-17 21:27
眼花啊  没看懂
作者: 付江涛    时间: 2014-7-17 22:28
yinxjfly 发表于 2014-7-17 21:02
看到回帖我更乱了!

反正2楼那哥们是看懂了
作者: 杨冬冬    时间: 2014-7-17 22:50
这个程序看着有点晕,复制一下参考
作者: cheye0207    时间: 2014-7-17 23:36
呵呵,看视频的时候弄清楚了,再看,又有点迷糊了
作者: yinxjfly    时间: 2014-7-17 23:54
付江涛 发表于 2014-7-17 22:28
反正2楼那哥们是看懂了

好吧!哥们,多少期?
作者: 付江涛    时间: 2014-7-18 00:12
yinxjfly 发表于 2014-7-17 23:54
好吧!哥们,多少期?

刚毕业,准备上大学,3年以后咯
作者: yinxjfly    时间: 2014-7-18 11:14
付江涛 发表于 2014-7-18 00:12
刚毕业,准备上大学,3年以后咯

厉害!加油哦!
作者: 付江涛    时间: 2014-7-18 11:45
yinxjfly 发表于 2014-7-18 11:14
厉害!加油哦!

恩恩~~加油~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2