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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓旭 中级黑马   /  2012-3-26 17:43  /  2018 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. try
  2.         {
  3.                 fos = new FileOutputStream("a_copy.mp3");
  4.                 fis = new FileInputStream("a.mp3");

  5.                 byte[] buf = new byte[1024];
  6.                 int len = 0;
  7.                 while((len = fis.read(buf))!=-1)
  8.                 {
  9.                         fos.write(buf,0,len);
  10.                 }
  11.                
  12.         }
  13. //这个就是没有缓冲区的,是比老师所说的第二种方法
  14. //我知道这也是相当于自定义了一个1kb的字节数组,但是我还是不明白这个和缓冲区的区别
  15. //运行时间为:46ms

  16. try
  17.         {
  18.                 bos = new BufferedOutputStream(new FileOutputStream("schnappi_copy.mp3"));
  19.                 bis = new BufferedInputStream(new FileInputStream("schnappi.mp3"));

  20.                 int len = 0;
  21.                 while((len = bis.read())!=-1)
  22.                 {
  23.                         bos.write((char)len);
  24.                         count++;
  25.                 }
  26.         }
  27. //这个就是有缓冲区的
  28. //运行时间为:170ms
复制代码
毕老师讲到IO流的缓冲区时候,我有一个问题,上面两段代码分别是不带缓冲区的文件拷贝,还有带缓冲区的文件拷贝
以字节流为例,拷贝的文件是3.5MB左右的一个mp3的文件,反而不用缓冲区的要快很多,这是为什么呢?

4 个回复

倒序浏览
没有缓冲区,系统计算时会给出默认的缓冲大小。  
你东西太小了,用那东西多创建对象,反而更慢吧,我感觉是这样。你读个一GB左右的东西,再看看呢。
回复 使用道具 举报
我刚才有测试了一下,用300MB,700MB测试了一下
感觉缓冲区比较接近512字节,不知道我这测试的准确不。
回复 使用道具 举报
缓冲区是重用内存的,这个主要是用于CPU提高文件读取的效率,而CPU的读写速度是远高于内存的,所以文件比较小的时候,缓冲的速度低于CPU的速度。如果没有这个缓冲区的话,CPU就不会不断读数据,写数据,如果文件较为大的时候,这样的效率是不是会很低呢。缓冲区的在读取数据的时候,CPu是不是可以去做其他的事情呢
回复 使用道具 举报
恩,了解了,3Q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马