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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我本想通过读取mp3和写出mp3文件,来检验InputStreamReader和OutputStreamWriter是不是真的把读取的字节转换为字符,而在写出时将字符转换为字节,但是下面代码却不行,为什么写出的mp3文件总小一些,不能播放,为什么?

  1. public static void main(String[] args) throws IOException
  2.         {
  3.                 //读取进来是字节,最后返回为字符:字节----->字符
  4.                 InputStreamReader input = new InputStreamReader(new FileInputStream("01.mp3"));
  5.                
  6.                
  7.                 //因为mp3格式的是字节形式读取,但是被转换为字符了,而这里是以字节形式写出,所以如果02.mp3能播放,则表示没有转换为字符,否则转换为字符了
  8.                 //FileOutputStream out = new FileOutputStream("02.mp3");
  9.                 //写出的原数据为字符,最终写出的是字节:字符----->字节
  10.                 OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("02.mp3"));
  11.                 int num = -1;
  12.                
  13.                 //通过一个mp3文件,这个文件的在读取是原数据就是字节,如果是转换为字符了,那么会是什么?
  14.                 while((num = input.read())!=-1){
  15.                        
  16.                         out.write(num);//这个方法是将指定的字节写入到目标文件中
  17.                         out.flush();
  18.                 }
  19.                 input.close();

  20.                 out.close();
  21.         }
复制代码


评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 很给力!

查看全部评分

9 个回复

倒序浏览
给你个提示,以reader,writer结尾的是什么流?读取MP3应该使用什么流,“字节流”和“字符流”,明白否

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3 赞一个!

查看全部评分

回复 使用道具 举报
问题是,不是InputStreamReader 是先以字节的形式读取进来的吗?而OutputStreamWriter是最终以字节输出的吗?难道理解错误了?

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3 赞一个!

查看全部评分

回复 使用道具 举报

回帖奖励 +1

感觉是这样的,我也没测试,想想看啊,reader是按照你的默认码表来读字符的,那么文件是mp3,那么mp3中自然会存在码表中不存在的字节,那么这种情况就是要么丢掉,要么用一种特殊的字符替换,这就会造成在写出去的时候出现问题,要么写出去的文件变小了(因为一部分数据丢失了),要么大小不变但是播放不了(因为数据被改变了)

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3 赞一个!

查看全部评分

回复 使用道具 举报 1 0
哦,先谢谢,那能不能知道那个mp3文件的编码后,在使用转换类时,以mp3的编码进行操作后,会不会还出现这种情况,或者说,怎么才能知道那mp3文件的编码
回复 使用道具 举报
读写MP3怎么能用字符流
回复 使用道具 举报
    public static void copy() throws Exception {
        // 我复制的是一个1.5m的MP3的歌 这个方法太慢了 得30-60秒
        FileInputStream fis = new FileInputStream(new File("d:\\star.mp3"));
        FileOutputStream fos = new FileOutputStream(new File("d:\\copy.mp3"));

        int len = 0;

        while ((len = fis.read()) != -1) {
            fos.write(len);
        }
        fos.close();
        fis.close();

    }

    public static void copy2() throws Exception {
        // 这个方法还是非常快的 3秒

        FileInputStream fis = new FileInputStream(new File("d:\\star.mp3"));
        FileOutputStream fos = new FileOutputStream(new File("d:\\copy2.mp3"));
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = fis.read(buf)) != -1) {
            fos.write(buf, 0, len);
        }
        fos.close();
        fis.close();

    }



我这俩个都能复制 就是第一个慢点

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 很给力!谢谢你的回答。。。

查看全部评分

回复 使用道具 举报
1.首先音乐一定要用字节流不能用字符流
2.做好放到一个数组中缓冲下 能快点
回复 使用道具 举报
学习.....
回复 使用道具 举报
回想了下毕老师的三个明确后,我想我的理解出错了,InputStreamReader和OutputStreamWriter始终是字符流体系,而我却用它们去操作纯字节文件
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马