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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 象牙 中级黑马   /  2014-8-19 12:42  /  1481 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

bis =new BufferedInputStream(new FileInputStream("1.mp3"));
bos = new BufferedOutputStream(new FileOutputStream("2.mp3"));
int len=0;
byte[] buf = new byte[bis.available()];
while((len=bis.read())!=-1)
{
bos.write(buf,0,len);
}
下边这个
bis =new BufferedInputStream(new FileInputStream("1.mp3"));
bos = new BufferedOutputStream(new FileOutputStream("2.mp3"));
int len=0;
while((len=bis.read())!=-1)
{
bos.write(len);
}
这两个结果差异很大是为什么呢

6 个回复

倒序浏览
上面的是一次读取一个byte数组,而且还有读取的起始位置,效率较高;下面的是一次读取一个字节,效率低
回复 使用道具 举报
顶你一个
回复 使用道具 举报
第一个感觉有问题,buf都没有读到内容,只是初始化了一下,拿什么东西写啊
回复 使用道具 举报
bbdeyouxang 发表于 2014-8-19 18:01
第一个感觉有问题,buf都没有读到内容,只是初始化了一下,拿什么东西写啊 ...

有一部分内容没写出来,但是代码运行的时候这个地方出错了,所以拿出来探讨一下
回复 使用道具 举报
上面的程序,问题在bos.write(buf,0,len);,byte[] buf = new byte[bis.available()];只是声明了数组的buf的长度,每个元素的初始值始终是0。所以bos.write(buf,0,len)写入的文件是空的。
下面的程序,len=bis.read();语句返回的是输入流读取到的内容,所以bos.write(len);没有问题。
回复 使用道具 举报
同楼上,楼主应该是声明数组后在while循环里使用的,在while语句中如果加上数组的话,也就是while((len=bis.read())!=-1)改成while((len=bis.read(ch)!=-1),结果应该就是和下面的一致的。这种方式是先读到数组中,然后把数组中的内容写出去,第二种方式是读出来一个,写出去一个,相对来说效率比较低。
建议用第一种方式,缓冲区就是依照第一种方式,内部封装一个数组用来存储数据。所以,效率很高。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马