当前位置 : 主页 > 编程语言 > c++ >

java中io流的复制方式和速度比较

来源:互联网 收集:自由互联 发布时间:2021-07-03
gistfile1.txt /* * 进行文件复制方法 及效率对比 * 四种方式 * 1. 字节流读写单个字节 135095 * 2. 字节流读写字节数组 208 推荐 * 3. 缓冲区读写单个字节 1187 * 4. 缓冲区读写字节数组 90 强烈推
gistfile1.txt
/*
 * 进行文件复制方法   及效率对比
 * 四种方式
 *   1. 字节流读写单个字节  135095
 *   2. 字节流读写字节数组  208   推荐
 *   3. 缓冲区读写单个字节  1187
 *   4. 缓冲区读写字节数组  90    强烈推荐
 *   我们复制一个25M大小的视屏文件1.avi
 *   数据源: c:\\1.avi
 *   数据目的: d:\\1.avi
 *   
 *   自己的复制功能,比固体要快,比Windows也要快
 *   为什么:
 *     流底层也是找Windows读写
 *     固态中,复制文件,依赖Windows
 *     复制,实现很多功能:
 *        目的,够不够装文件
 *        判断用户有没有复制权限,粘贴权限
 *   
 */
import java.io.*;
public class CopyFile_Test {
        public static void main(String[] args) {
                // 测试效率,采用毫秒值计算
                long start = System.currentTimeMillis();
                copy_4();
                long end = System.currentTimeMillis();
                System.out.println(end - start);
        }
        /*
         * 4. 缓冲区读写字节数组
         */
        public static void copy_4(){
                // 创建2个缓冲区流的变量,=null
                BufferedInputStream bis = null;
                BufferedOutputStream bos = null;
                try {
                        // 创建字节流缓冲区对象,传递字节流
                        bis = new BufferedInputStream(
                                        new FileInputStream("c:\\m.exe"));

                        // 创建字节输出流缓冲区对象,传递字节输出流
                        bos = new BufferedOutputStream(
                                        new FileOutputStream("d:\\m.exe"));

                        // 读写字节数组
/*
 *当数组长度,在一定范围内长度更大的时候,复制速度会更快,
 *但如果过长,系统在为bytes分配数组的时间就会很长,反而降低了复         *制速度.所以不能使用太长的数组.
*/
                        byte[] bytes = new byte[1024];

                        int len = 0;
                        while ((len = bis.read(bytes)) != -1) {
                                bos.write(bytes,0,len);
                        }
                } catch (IOException ex) {
                        throw new RuntimeException("文件复制失败");
                } finally {
                        MyCloseStream.close(bis, bos);
                }        
        }

        /*
         * 3. 缓冲区读写单个字节
         */
        public static void copy_3() {
                // 创建2个缓冲区流的变量,=null
                BufferedInputStream bis = null;
                BufferedOutputStream bos = null;
                try {
                        // 创建字节流缓冲区对象,传递字节流
                        bis = new BufferedInputStream(
                                        new FileInputStream("c:\\1.avi"));

                        // 创建字节输出流缓冲区对象,传递字节输出流
                        bos = new BufferedOutputStream(
                                        new FileOutputStream("d:\\1.avi"));

                        // 读写单个字节
                        int len = 0;
                        while ((len = bis.read()) != -1) {
                                bos.write(len);
                        }
                } catch (IOException ex) {
                        throw new RuntimeException("文件复制失败");
                } finally {
                        MyCloseStream.close(bis, bos);
                }
        }

        /*
         * 2. 字节流读写字节数组
         */
        public static void copy_2() {
                FileInputStream fis = null;
                FileOutputStream fos = null;
                try {
                        fis = new FileInputStream("c:\\1.avi");
                        fos = new FileOutputStream("d:\\1.avi");
                        // 定义字节数组,长度1024整数倍
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        while ((len = fis.read(bytes)) != -1) {
                                // fos流写字节数组
                                fos.write(bytes, 0, len);
                        }
                } catch (IOException ex) {
                        ex.printStackTrace();
                        throw new RuntimeException("复制失败");
                } finally {
                        // 调用工具类close方法
                        MyCloseStream.close(fis, fos);
                }
        }

        /*
         * 1. 字节流读写单个字节
         */
        public static void copy_1() {
                // 声明2个流对象,=null
                FileInputStream fis = null;
                FileOutputStream fos = null;
                try {
                        // 创建2个流对象,new
                        fis = new FileInputStream("c:\\1.avi");
                        fos = new FileOutputStream("d:\\1.avi");
                        // fis读取1个字节,fos写1个字节
                        int len = 0;
                        while ((len = fis.read()) != -1) {
                                fos.write(len);
                        }
                } catch (IOException ex) {
                        ex.printStackTrace();
                        throw new RuntimeException("复制失败");
                } finally {
                        MyCloseStream.close(fis, fos);
                }
        }
}



MyCloseStream.java

/*  关闭方法close的细节
 *  单独的close方法,定义一套自己的try catch处理
 *  保证所有的close都会执行到
 */
import java.io.*;
public class CopyFile {
        public static void main(String[] args) {
                //声明2个流对象,=null
                FileInputStream fis = null;
                FileOutputStream fos = null;
                try{
                        //创建2个流对象,new
                        fis = new FileInputStream("c:\\t.jpg");
                        fos = new FileOutputStream("d:\\t.jpg");
                        //fis读取1个字节,fos写1个字节
                        int len = 0 ;
                        while((len = fis.read())!=-1){
                                fos.write(len);
                        }
                }catch(IOException ex){
                        ex.printStackTrace();
                        throw new RuntimeException("复制失败");
                }finally{
                        try{
                                if(fos!=null)
                                        fos.close();
                        }catch(IOException ex){
                                throw new RuntimeException("释放资源失败");
                        }finally{
                                try{
                                        if(fis!=null)
                                                fis.close();
                                }catch(IOException ex){
                                        throw new RuntimeException("释放资源失败");
                                }
                        }
                }
        }
}
上一篇:Spring基础入门
下一篇:Java项目命名规范
网友评论