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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李健_8 中级黑马   /  2012-9-17 00:30  /  1116 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 火火 于 2012-9-17 01:35 编辑

package com.itheima;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test5 {
   public static void main(String[] args) throws Exception{
    BufferedInputStream bis=
     new BufferedInputStream(
       new FileInputStream("d:/1.mp3"));
    BufferedOutputStream bos =
     new BufferedOutputStream(
       new FileOutputStream("d:/2.mp3"));
    byte [] buf=new byte[1024];
    int len=bis.read(buf);
    while(-1!=len){
     bos.write(buf);
    }
    bos.flush();
   
    bos.close();
       bis.close();   
   }
}
这段执行拷贝  为什么有问题

2 个回复

倒序浏览
楼主的代码主要有两个问题,规范一下就好了。
    首先最明显就是 --while(-1 != len);--   这里的循环条件有问题:这里的len的值是1024,所以while的条件一直为真,一直会往2.mp3里写数据,这里不会停下。len的作用就是判断数组中的取到的元素个数,如果取到结尾会取回一个标记,len为-1(这里用的是缓冲区输出,这个速度很吓人的,不到4秒就忆经700M数据了)。
    其次是flush()的位置。刷新应该放在while循环中,每取一个数组长度的数据我们就把缓冲写到目的地,虽然缓冲区的空间很大,可以满足一般需要求,但养成一个习惯总是好的。
    【建议】如果是刚开始学习我觉得我们把老师的步骤记下来照着写,可以会有那么几句不懂什么意思,但写习惯之后自己就记住了,手熟了,等到知道经验多点之后再写到此处那些疑点就一下明了,而且还印象深刻。学习就是刚开始记住表象,等学到一定时候就可以从实质上来解说表象了。这里给楼主贴出来我自学时练习的代码和注释,看过之后应该能理解每一步的目的。
================================================================
  1. public static void main(String[] args) throws IOException {
  2.                 BufferedInputStream bufin = new BufferedInputStream(//定义字节缓冲
  3.                                 new FileInputStream("d:\\12.mp3"));
  4.                 BufferedOutputStream bufout = new BufferedOutputStream(
  5.                                 new FileOutputStream("d:\\1111.mp3"));//定义字节缓冲输出
  6.                 byte[] by = new byte[bufin.available()];//定义长度为对象字节长度的数组
  7.                 int len = 0;//计数,读入数组的字节长度
  8.                 if((len = bufin.read(by)) != -1) {//一次全读进数组,这里用if条件,因为一次就可以全读取完,不然就用while
  9.                         bufout.write(by,0,len);//这里一次性输出相应长度的数组内容,如果数组内容是1024的大小,那么就用while来多次取多次输出
  10.                         bufout.flush();//刷新保存
  11.                 }
  12.                 bufout.close();//关闭流
  13.                 bufin.close();
  14.         }
  15. }
复制代码
回复 使用道具 举报
运行成功  楼上正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马