黑马程序员技术交流社区

标题: 输入流写入的问题 [打印本页]

作者: 象牙    时间: 2014-8-19 12:42
标题: 输入流写入的问题
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);
}
这两个结果差异很大是为什么呢
作者: hsy    时间: 2014-8-19 13:05
上面的是一次读取一个byte数组,而且还有读取的起始位置,效率较高;下面的是一次读取一个字节,效率低
作者: 黑马黄武先    时间: 2014-8-19 13:24
顶你一个
作者: bbdeyouxang    时间: 2014-8-19 18:01
第一个感觉有问题,buf都没有读到内容,只是初始化了一下,拿什么东西写啊
作者: 象牙    时间: 2014-8-19 18:15
bbdeyouxang 发表于 2014-8-19 18:01
第一个感觉有问题,buf都没有读到内容,只是初始化了一下,拿什么东西写啊 ...

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2