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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.io.*;

class MyBufferedInputStream
{
    private InputStream in;

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

    private int pos = 0;//用于操作数组元素的指针(索引,角标)。
    private int count = 0;//记录住每一次往数组中存储的元素个数。
    MyBufferedInputStream(InputStream in)
    {
        this.in = in;
    }
    /*
    为什么,字节读取流的read方法一次读一个字节,返回值类型,不是byte,而是int呢?
    那是因为,在读取一个字节数据时,容易出现连续8个1的情况,连续8个1是-1.
    正好符合了流结束标记。所以为了避免,流操作数据是提前结束,
    将读到的字节进行int类型的提升。保留该字节数据的同时,前面都补0.避免-1的情况。
    */
    public int myRead()throws IOException
    {
        //使用流对象从硬盘抓一批进数组缓冲区。
        if(count==0)
        {
            count = in.read(buf);
            if(count<0)
                return -1;

            pos = 0;
            byte b = buf[pos];
            
            pos++;
            count--;

            return b&255;
        }
        else if(count>0)
        {
            byte b = buf[pos];
            pos++;
            count--;
            return b&0xFF;
        }

        return -1;
    }
    public void myClose()throws IOException
    {
        in.close();
    }
}
=========调用以上类======
    public static void copyMp3()throws IOException
    {
        MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("c:\\0.mp3"));

        BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\6.mp3"));

        int temp = 0;

        while((temp=bufis.myRead())!=-1)
        {
            bufos.write(temp);//输出流的write方法虽然接收是一个整数,四个字节,但是write只将最后一个字节写出。
                            //其他字节抛弃。
        }
        bufos.close();
        bufis.myClose();
    }

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马