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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Paul_Chang 中级黑马   /  2014-10-30 22:39  /  2154 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2. 演示MP3的复制
  3. */
  4. import java.io.*;
  5. class CopyMp3
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 long start = System.currentTimeMillis();
  10.                 copyMethod_1();
  11.                 //copyMethod_2();
  12.                 long end = System.currentTimeMillis();

  13.                 System.out.println("运行时间="+(end - start)+"毫秒");
  14.         }
  15.        

  16.         //通过字节流缓冲区完成复制
  17.         public static void copyMethod_2()
  18.         {
  19.                 BufferedInputStream buis = null;
  20.                 BufferedOutputStream buos = null;

  21.                 try
  22.                 {
  23.                         buis = new BufferedInputStream(new FileInputStream("再见理想.mp3"));
  24.                         buos = new BufferedOutputStream(new FileOutputStream("再见理想-beyond2.mp3"));
  25.                        
  26.                         int by = 0;
  27.                         while ((by = buis.read())!=-1)
  28.                         {
  29.                                 buos.write(by);
  30.                         }
  31.                        
  32.                 }
  33.                 catch (IOException e )
  34.                 {
  35.                         throw new RuntimeException("复制文件失败");
  36.                 }
  37.                 finally
  38.                 {
  39.                         try
  40.                         {
  41.                                 if (buis!=null)
  42.                                         buis.close();
  43.                         }
  44.                         catch (IOException e)
  45.                         {
  46.                                 throw new RuntimeException("读取关闭失败");
  47.                         }
  48.                         try
  49.                         {
  50.                                 if (buos!=null)
  51.                                         buos.close();
  52.                         }
  53.                         catch (IOException e)
  54.                         {
  55.                                 throw new RuntimeException("写入关闭失败");
  56.                         }
  57.                 }
  58.         }

  59.         //通过字节流完成复制
  60.        
  61.         public static void copyMethod_1()
  62.         {
  63.                 FileInputStream fis = null;
  64.                 FileOutputStream fos = null;

  65.                 try
  66.                 {
  67.                         fis = new FileInputStream("再见理想.mp3");
  68.                         fos = new FileOutputStream("Beyond-再见理想.mp3");

  69.                         byte[] buf = new byte[1024];

  70.                         int len = 0;
  71.                         while ((len = fis.read(buf))!=-1)
  72.                         {
  73.                                 fos.write(buf,0,len);
  74.                         }
  75.                 }
  76.                 catch (IOException e)
  77.                 {
  78.                         throw new RuntimeException("复制文件失败");
  79.                 }
  80.                 finally
  81.                 {
  82.                         try
  83.                         {
  84.                                 if (fis!=null)
  85.                                         fis.close();
  86.                         }
  87.                         catch (IOException e)
  88.                         {
  89.                                 throw new RuntimeException("读取关闭失败");
  90.                         }
  91.                         try
  92.                         {
  93.                                 if (fos!=null)
  94.                                         fos.close();
  95.                         }
  96.                         catch (IOException e)
  97.                         {
  98.                                 throw new RuntimeException("写入关闭失败");
  99.                         }
  100.                 }
  101.         }
  102. }
复制代码
按理说使用字节流缓冲区应该比字节流直接复制要快啊,可是我的运行结果却是copyMethod_1()的运行时间短于copyMethod_2(),想不明白,还是我的代码有问题?!

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
自己顶起来.....
回复 使用道具 举报
copyMethod_2()方法中,你用的是java中自带的字节流缓冲区;
copyMethod_1()方法中,你也是用了缓冲区啊,只不过是你自己手动定义的。
给你说一个我自己想的例子:假如你去捡鸡蛋,捡一个就送家里一个,效率特别低,还能把你累死。
这样你就会手里拿一个篮子,一直捡到篮子满为止,再送回家,这样效率就高了很多。
这就是我想到的缓冲区的道理,可能不准确吧。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
姜浩 发表于 2014-10-31 14:36
copyMethod_2()方法中,你用的是java中自带的字节流缓冲区;
copyMethod_1()方法中,你也是用了缓冲区啊, ...

可不可以理解为API定义好的缓冲区比较复杂,导致运行速度比自定义慢?
回复 使用道具 举报
Paul_Chang 发表于 2014-10-31 16:53
可不可以理解为API定义好的缓冲区比较复杂,导致运行速度比自定义慢?

应该不是这个问题。毕竟那都是一代代大神们总结出来的。
可能和运行代码的时候,cpu的使用率有关系吧,也有可能是你复制的文件不够大,没能体现出来优势。

评分

参与人数 1黑马币 +5 收起 理由
Paul_Chang + 5 赞一个!

查看全部评分

回复 使用道具 举报
姜浩 发表于 2014-10-31 17:00
应该不是这个问题。毕竟那都是一代代大神们总结出来的。
可能和运行代码的时候,cpu的使用率有关系吧,也 ...

感谢解答啊,我把三种方法都写了,一会拿个大点的文件实验下...
回复 使用道具 举报
本帖最后由 Paul_Chang 于 2014-10-31 18:07 编辑
姜浩 发表于 2014-10-31 17:00
应该不是这个问题。毕竟那都是一代代大神们总结出来的。
可能和运行代码的时候,cpu的使用率有关系吧,也 ...

进行了简单的DOE验证(结果如下),从有限样本看      1.感觉method_2()方法执行时间比较均衡,method_1()方法浮动比较大;
      2.当文件增大时,两种方法的时间差距在缩短;
      3.由于样本有限,无法得出更进一步结论.......

                                                            第一次                第二次               第三次
文件(1.56G):          method_1():         82490毫秒         79073毫秒        108272毫秒
Alien.mp4             method_2():        144688毫秒        148441毫秒      149806毫秒

文件(6.06M):          method_1():         1060毫秒              77毫秒              126毫秒
再见理想.mp3         method_2():         433毫秒              436毫秒             445毫秒


回复 使用道具 举报
这个问题像7楼那样理解,理论上是字节缓冲流的读写速度比字节流快,因为字节缓冲流是读取缓冲区的数据,缓冲区的数据是存在内存的,字节流的读取是直接对硬盘的操作,很明显内存的读写速度比硬盘的读写速度快;但具体情况还得分析文件的大小、cpu的占用率等问题。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马