黑马程序员技术交流社区
标题:
IO流问题
[打印本页]
作者:
李健_8
时间:
2012-9-17 00:30
标题:
IO流问题
本帖最后由 火火 于 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();
}
}
这段执行拷贝 为什么有问题
作者:
张飞年
时间:
2012-9-17 01:12
楼主的代码主要有两个问题,规范一下就好了。
首先最明显就是 --while(-1 != len);-- 这里的循环条件有问题:这里的len的值是1024,所以while的条件一直为真,一直会往2.mp3里写数据,这里不会停下。len的作用就是判断数组中的取到的元素个数,如果取到结尾会取回一个标记,len为-1(这里用的是缓冲区输出,这个速度很吓人的,不到4秒就忆经700M数据了)。
其次是flush()的位置。刷新应该放在while循环中,每取一个数组长度的数据我们就把缓冲写到目的地,虽然缓冲区的空间很大,可以满足一般需要求,但养成一个习惯总是好的。
【建议】如果是刚开始学习我觉得我们把老师的步骤记下来照着写,可以会有那么几句不懂什么意思,但写习惯之后自己就记住了,手熟了,等到知道经验多点之后再写到此处那些疑点就一下明了,而且还印象深刻。学习就是刚开始记住表象,等学到一定时候就可以从实质上来解说表象了。这里给楼主贴出来我自学时练习的代码和注释,看过之后应该能理解每一步的目的。
================================================================
public static void main(String[] args) throws IOException {
BufferedInputStream bufin = new BufferedInputStream(//定义字节缓冲
new FileInputStream("d:\\12.mp3"));
BufferedOutputStream bufout = new BufferedOutputStream(
new FileOutputStream("d:\\1111.mp3"));//定义字节缓冲输出
byte[] by = new byte[bufin.available()];//定义长度为对象字节长度的数组
int len = 0;//计数,读入数组的字节长度
if((len = bufin.read(by)) != -1) {//一次全读进数组,这里用if条件,因为一次就可以全读取完,不然就用while
bufout.write(by,0,len);//这里一次性输出相应长度的数组内容,如果数组内容是1024的大小,那么就用while来多次取多次输出
bufout.flush();//刷新保存
}
bufout.close();//关闭流
bufin.close();
}
}
复制代码
作者:
李健_8
时间:
2012-9-17 01:34
运行成功 楼上正解
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2