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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.io.*;
  2. //用不同方法复制一个8m大小的MP3文件并统计运行时间
  3. public class Test {
  4.         public static void main(String[] args) throws IOException{
  5.                  long startTime = System.currentTimeMillis();
  6.          copyFile_1();
  7.          long endTime = System.currentTimeMillis();
  8.          System.out.println(endTime-startTime+"ms");
  9.          
  10.          startTime = System.currentTimeMillis();
  11.          copyFile_2();
  12.          endTime = System.currentTimeMillis();
  13.          System.out.println(endTime-startTime+"ms");
  14.          
  15.          startTime = System.currentTimeMillis();
  16.          copyFile_3();
  17.          endTime = System.currentTimeMillis();
  18.          System.out.println(endTime-startTime+"ms");
  19.          
  20.          startTime = System.currentTimeMillis();
  21.          copyFile_4();
  22.          endTime = System.currentTimeMillis();
  23.          System.out.println(endTime-startTime+"ms");
  24. }

  25. //基本读取方式
  26. public static void copyFile_1() throws IOException {
  27.          //创建IO流对象
  28.          FileInputStream fis = new FileInputStream("D:\\An end,once and for all.mp3");
  29.          FileOutputStream fos = new FileOutputStream("D:\\An end,once and for all1.mp3");
  30.          
  31.          int data = 0;
  32.          //循环读取
  33.          while ((data=fis.read())!=-1) {
  34.                  fos.write(data);
  35.          }
  36.                  fis.close();
  37.                  fos.close();               
  38. }

  39. //在基本读取的方式上定义字节数组作为缓存
  40. public static void copyFile_2() throws IOException {

  41.          FileInputStream fis = new FileInputStream("D:\\An end,once and for all.mp3");
  42.          FileOutputStream fos = new FileOutputStream("D:\\An end,once and for all2.mp3");
  43.          
  44.          byte[] buf = new byte[1024];
  45.          int len = 0;
  46.          while ((len=fis.read(buf))!=-1) {
  47.                  fos.write(buf,0,len);
  48.          }
  49.                  fis.close();
  50.                  fos.close();                        
  51. }

  52. //通过装饰类来读写文件
  53. public static void copyFile_3() throws IOException {
  54.          BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\An end,once and for all.mp3"));
  55.          BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("D:\\An end,once and for all3.mp3"));
  56.          
  57.          int data = 0;
  58.          while ((data=fis.read())!= -1) {
  59.                  fos.write(data);
  60.          }
  61.                  fis.close();
  62.                  fos.close();               
  63. }

  64. //在使用装饰类也同时使用字节数组缓存
  65. public static void copyFile_4() throws IOException {
  66.       
  67.          BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\An end,once and for all.mp3"));
  68.          BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("D:\\An end,once and for all4.mp3"));
  69.          
  70.          int data = 0;
  71.          byte[] buf = new byte[1024];
  72.          while ((data=fis.read(buf))!= -1) {
  73.                  fos.write(buf,0,data);                                    
  74.          }
  75.                  fis.close();
  76.                  fos.close();               
  77. }   
  78. }
复制代码
运行结果:
62894ms
94ms
109ms
23ms

虽说是有缓存数组,为何第四种方式比其他都快这么多呢?第一种方式为什么会比其他三种方式慢这么多?不解,请指教,先谢谢了

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
就像毕老师觉得喝水的例子,是找个杯子接满一起喝,还是一滴滴等着喝快??
第一种方式是读一个字符就写一次,第二种独到的放进数组,再一次性的写!第三、第四一样只不过加入了缓冲技术。
2、4比1、3少了很多往出写的次数,这就少了很多的时间。毕竟切换一次也是要花时间的。4和2比较就是加入了缓冲技术,所以减少时间很多的!

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马