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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付江涛 金牌黑马   /  2014-7-17 16:28  /  3410 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 付江涛 于 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的元素。




评分

参与人数 1技术分 +2 收起 理由
Doraemon + 2

查看全部评分

15 个回复

倒序浏览
其实每次循环时并不是每次都取角标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;
复制代码

评分

参与人数 1技术分 +1 收起 理由
Doraemon + 1

查看全部评分

回复 使用道具 举报
本来不懂的,看了你的理解瞬间懂了
回复 使用道具 举报
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 17:23
本来不懂的,看了你的理解瞬间懂了

{:3_46:} 理解能力挺强的哈 我都不知道我说了什么~不过现在终于弄懂了~
回复 使用道具 举报
看的我眼花缭乱!
回复 使用道具 举报
yinxjfly 发表于 2014-7-17 20:02
看的我眼花缭乱!

别看帖子了,确实挺乱的,现在感觉也不能,把自己当做主线程,按流程分析一遍,就明白了
回复 使用道具 举报
付江涛 发表于 2014-7-17 20:15
别看帖子了,确实挺乱的,现在感觉也不能,把自己当做主线程,按流程分析一遍,就明白了 ...

看到回帖我更乱了!
回复 使用道具 举报
眼花啊  没看懂
回复 使用道具 举报
yinxjfly 发表于 2014-7-17 21:02
看到回帖我更乱了!

反正2楼那哥们是看懂了
回复 使用道具 举报
这个程序看着有点晕,复制一下参考
回复 使用道具 举报
呵呵,看视频的时候弄清楚了,再看,又有点迷糊了
回复 使用道具 举报
付江涛 发表于 2014-7-17 22:28
反正2楼那哥们是看懂了

好吧!哥们,多少期?
回复 使用道具 举报
yinxjfly 发表于 2014-7-17 23:54
好吧!哥们,多少期?

刚毕业,准备上大学,3年以后咯
回复 使用道具 举报
付江涛 发表于 2014-7-18 00:12
刚毕业,准备上大学,3年以后咯

厉害!加油哦!
回复 使用道具 举报

恩恩~~加油~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马