黑马程序员技术交流社区

标题: IO流复制效率问题 [打印本页]

作者: 曹昌豪    时间: 2012-5-21 18:59
标题: IO流复制效率问题
import java.io.*;
//用不同的方法复制文件并统计执行时间
public class CopyFile_2 {
        
        public static void main(String[] args) throws IOException {
               
                long start = System.currentTimeMillis();
                copyFile_1();
                long end = System.currentTimeMillis();
                System.out.println(end-start+"毫秒");
               
                start = System.currentTimeMillis();
                copyFile_2();
                end = System.currentTimeMillis();
                System.out.println(end-start+"毫秒");
               
                start = System.currentTimeMillis();
                copyFile_3();
                end = System.currentTimeMillis();
                System.out.println(end-start+"毫秒");
               
                start = System.currentTimeMillis();
                copyFile_4();
                end = System.currentTimeMillis();
                System.out.println(end-start+"毫秒");
        }
        
        //基本读取方式
        public static void copyFile_1() throws IOException        {
                //创建IO流对象
                FileInputStream fis = new FileInputStream("D:\\Kugou\\in\\xuewei - jia.mp3");
                FileOutputStream fos = new FileOutputStream("jia1.mp3");
               
                int data = 0;
                //循环读写数据
                while ((data=fis.read())!=-1) {
                        fos.write(data);
                }
                        fis.close();
                        fos.close();               
        }
        
        //在基本读取的方式定义字节数组作为缓冲
        public static void copyFile_2() throws IOException        {
                //创建IO流对象
                FileInputStream fis = new FileInputStream("D:\\Kugou\\in\\xuewei - jia.mp3");
                FileOutputStream fos = new FileOutputStream("jia2.mp3");
               
                byte[] buf = new byte[1024];
                int len = 0;
                //循环读写数据
                while ((len=fis.read(buf))!=-1) {
                        fos.write(buf,0,len);
                }
                        fis.close();
                        fos.close();                        
        }
        
        //通过包装类来读取和写入文件
        public static void copyFile_3() throws IOException {
                //创建IO流对象
                BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\Kugou\\in\\xuewei - jia.mp3"));
                BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("jia3.mp3"));
               
                int data = 0;
                //循环读写数据
                while ((data=fis.read())!= -1) {
                        fos.write(data);
                }
                        fis.close();
                        fos.close();               
        }
        
        //在使用包装类也同时使用数组缓冲
        public static void copyFile_4() throws IOException {
                //创建IO流对象
                BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\Kugou\\in\\xuewei - jia.mp3"));
                BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("jia4.mp3"));
               
                int data = 0;
                byte[] buf = new byte[1024];
                //循环读写数据
                while ((data=fis.read(buf))!= -1) {
                        fos.write(buf,0,data);                                    
                }
                        fis.close();
                        fos.close();               
        }   
}
运行结果
59578毫秒
79毫秒
89毫秒
24毫秒

//为何第四种方式比较块呢,而且在包装类中已经封装得有数组,为何还需要在外面再定义一个数组呢?第一种方式为什么会比其他三种方式慢这么多?不解,请指教,先谢谢了。
作者: 袁培育    时间: 2012-5-22 11:16
其实缓冲区好比是一个小容器,数组是一个比缓冲区稍大的容器,就好比你手动复制一篇文章,第一个方法是你一次复制一个字粘贴一个字,这样当然慢了,第二个是你一次复制一个数组容器容量的数据再一次性粘出去,速度较快,第三个是你一次复制资格缓冲区容器容量的数据再一次性粘出去,第四个是一次往一个数组容器中加入一个缓冲区容量的数据(第二种是一次往数组里加一个字节的数据加满后在一次写出去),再一次把数组容器里的数据写出去,速度最快。




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