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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张超超 黑马帝   /  2012-4-20 09:56  /  1667 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
需求
自定义字节流缓冲区

*/
import java.io.*;
class MyBufferedInputStream
{
    private InputStream in;
    private byte[] buf = new byte[1024*4];
    private int pos = 0,count = 0;
   
    MyBufferedInputStream(InputStream in)
    {
        this.in = in;
    }
   
    //一次读一个字符,从缓冲区(字节数组)获取
    public int myRead()throws IOException
    {
        //返回为int类型是为了提升返回值的类型
        //通过in对象读取硬盘上数据,并储存buf中
        if (count==0)
        {
            count = in.read(buf);
            if(count<0)
                return -1;
            pos = 0;
            byte b = buf[pos];

            count--;
            pos++;
            
            return b&255;
        }
        else
        {
            byte b = buf[pos];

            count--;
            pos++;
            
            return b&0xff;            
        }        
    }
    public void myClose()throws IOException
    {
        in.close();
    }            
}
class MyBufferedInputStreamDemo
{
    public static void main(String[] args)throws IOException
    {
        myCopyMusic();
    }
    public static void myCopyMusic()throws IOException
    {
        MyBufferedInputStream mbis = new MyBufferedInputStream(new FileInputStream("F:\\2.mp3"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\1.mp3"));
        int ch = 0;
        
        while((ch=mbis.myRead())!=-1)
        {
            bos.write(ch);
        }
        bos.close();
        mbis.myClose();
    }
}




注意此处的 if(count<0)
return -1;
按小弟的理解,当文件中数据不满足1024*4个字节,并读到最末位后,会将不满足1024*4个字节的数据存入自己数组buf,并返回-1。
但问题是返回-1后,写入流就会关闭,那么字节数组中剩余的不满1024*4个字节的数据将不会被写入,即复制可能不会成功,字节数组中剩余的数据没被复制。

但经过运行,发现代码是正确的,小弟就有点想不通了,还望各位大哥指点迷津,非常感谢。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

1 个回复

倒序浏览
都说你调用的read()方法的返回值是从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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