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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王陶成 中级黑马   /  2012-9-11 14:38  /  1433 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王陶成 于 2012-9-11 17:39 编辑

  
          看我毕老师的自定义字节缓冲流视频,自己模仿着写了一个,可是复制mp3的时候报出了错误,不知道这个是什么错误,

麻烦给看一下

import java.io.IOException;
import java.io.InputStream;

class MyBufferedInputStream {
        private InputStream in;
        private byte[] buf = new byte[1024];
        
        //指针,计数器
        private int pos = 0, count = 0;
        
        public MyBufferedInputStream(InputStream in) {
                this.in = in;
        }
        
        public int myRead() throws IOException {
               
               
                if(count == 0) {
                        count = in.read(buf);
                        
                        if(count<0){
                                return -1;
                        }

                        byte b = buf[pos];
                        
                        count --;
                        pos ++;
                        return b&255;
                }
                else if(count > 0) {
                        byte b = buf[pos];
                        count --;
                        pos ++;
                        return b&0xff;
                }
                return -1;
        }
        public void myClose() throws IOException {
                in.close();
        }
}


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyMp3 {
        public static void main(String[] args) throws IOException {
                long start = System.currentTimeMillis();
                copy();
                long end = System.currentTimeMillis();
                long time = end - start;
               
                //获取拷贝时间
                System.out.println(time);
        }
        
        

        public static void copy() throws IOException {
                MyBufferedInputStream bis = new MyBufferedInputStream(new FileInputStream("demo.mp3"));
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("demo_copy.mp3"));
               
                int by = 0;
                while((by=bis.myRead()) != -1) {

                        bos.write(by);
        
                }
                bis.myClose();
                bos.close();
        }
}



Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4096
        at day19.MyBufferedInputStream.myRead(MyBufferedInputStream.java:36)
        at day19.CopyMp3.copy_2(CopyMp3.java:42)
        at day19.CopyMp3.main(CopyMp3.java:14)

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
本帖最后由 张飞年 于 2012-9-11 15:41 编辑

找的我好辛苦,呵呵 ,楼主是少了一句代码,我就不截图了,在myRead()方法里面count在减pos在加,当count减到0时我们一下子再读满一数组再一个一个取,问题就在这,当我们读满一个数组即1024个字节内容后在这个方法中count被前面赋值字符串长度1024,但pos并没有归零,所以这此要归零操作,加上 : pos = 0;
======完整代码======================================================
  1. public int myRead() throws IOException {
  2.   if (count == 0) {
  3.    count = in.read(buf);//这里是一次读满一组数组,那count为1024
  4.    if (count < 0) {
  5.     return -1;
  6.    }
  7.    pos = 0;//指针归零
  8.    byte b = buf[pos];//按个取出,这里取buf[0]
  9.    count--;//总数减一个
  10.    pos++;//指针移位
  11.    // System.out.println(b);
  12.    return b * 255;//将将int转换为byte
  13.   }
  14.   if (count > 0) {
  15.    byte b = buf[pos];//数组还没取完
  16.    count--;
  17.    pos++;
  18.    return b * 0xff;//将将int转换为byte
  19.   }
  20.   return -1;
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张飞年 发表于 2012-9-11 15:34
找的我好辛苦,呵呵 ,楼主是少了一句代码,我就不截图了,在myRead()方法里面count在减pos在加,当count减 ...

哦。真是啊,找了半天也不知道问题在哪,真是谢谢啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马