黑马程序员技术交流社区

标题: 对于IO缓冲区的疑惑 [打印本页]

作者: 李晓旭    时间: 2012-3-26 17:43
标题: 对于IO缓冲区的疑惑
  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的文件,反而不用缓冲区的要快很多,这是为什么呢?
作者: 应佳锋    时间: 2012-3-26 17:55
没有缓冲区,系统计算时会给出默认的缓冲大小。  
你东西太小了,用那东西多创建对象,反而更慢吧,我感觉是这样。你读个一GB左右的东西,再看看呢。
作者: 李晓旭    时间: 2012-3-26 18:28
我刚才有测试了一下,用300MB,700MB测试了一下
感觉缓冲区比较接近512字节,不知道我这测试的准确不。
作者: 李涛涛    时间: 2012-3-26 21:17
缓冲区是重用内存的,这个主要是用于CPU提高文件读取的效率,而CPU的读写速度是远高于内存的,所以文件比较小的时候,缓冲的速度低于CPU的速度。如果没有这个缓冲区的话,CPU就不会不断读数据,写数据,如果文件较为大的时候,这样的效率是不是会很低呢。缓冲区的在读取数据的时候,CPu是不是可以去做其他的事情呢

作者: 李晓旭    时间: 2012-3-26 22:08
恩,了解了,3Q




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