关于BufferedOutputStream高效的问题

梵高先生的天空之城 2016-05-18 05:52:19
java新人一枚,在学习java 字节输出流时有些困惑。以FileOutputStream为例,复制一个MP3(10M)文件代码如下
FileInputStream fis = new FileInputStream("E:\\test.mp3"); //输入流
FileOutputStream fos = new FileOutputStream("e:\\test2.mp3"); //输出流
int len = 0; //读取字节数
byte buf[] = new byte[1024]; //缓冲区
while((len = fis.read(buf)) != -1)
{
fos.write(buf,0,len); //将缓冲区的数据写入硬盘。
}
这个时间是312ms;

而使用BufferedOutputStream包装下的话
FileInputStream fis = new FileInputStream("E:\\test.mp3"); //输入流
FileOutputStream fos = new FileOutputStream("e:\\test2.mp3"); //输出流
BufferedOutputStream bufos = new BufferedOutputStream(fos);
int len = 0; //读取字节数
byte buf[] = new byte[1024]; //缓冲区
while((len = fis.read(buf)) != -1)
{
bufos .write(buf,0,len); //将缓冲区的数据写入硬盘。
}
这个时间是140ms。
查看过源码 调用的也是write方法,第一种方法已近使用了缓冲区了,为什么第二种会比第一种方法快?很是不解。
...全文
670 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ethan_Fung 2018-02-06
  • 打赏
  • 举报
回复
第一个没有使用缓冲输入出流,第二个才有。
Naughtyyou 2016-05-19
  • 打赏
  • 举报
回复
buffered里面的缓存区比较大 好像是8000多字节 缓存区满了才会写到硬盘 或者flush()到硬盘 这样他操作硬盘的次数就少了 多是在内存操作 速度当然要快了
铁河 2016-05-18
  • 打赏
  • 举报
回复
实际上字节流在操作本身不会用到缓冲区(内存),是文件本身直接操作的。 以上这句话我在李兴华的java开发实战经典12.3.3节里看到的。对于你第一个程序开僻字节数组那里注释是缓冲我表示怀疑。以上仅供参考
qq_35043751 2016-05-18
  • 打赏
  • 举报
回复
buffered流里面其实缓冲的字节数更大,所以效率略高点吧。。。小白见解,求大神指导
铁河 2016-05-18
  • 打赏
  • 举报
回复
占坑,等别人答,我也想知道

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧