Java文件复制,模拟右键复制(字节流,缓冲流)

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

字节流模拟复制粘贴

明确

  • 数据源:D:\jdk-11中文api修订版.CHM
  • 目的地:E:\jdk-11中文api修订版.CHM

被复制的文件:56.4 MB (59,176,862 字节)
在这里插入图片描述

文件复制的步骤:

  1. 创建文件字节输入流的FileInputStream对象,构造方法中绑定要读取的数据源
  2. 创建文件字节输出流FileOutputStream对象,构造方法中绑定要写入的目的地
  3. 使用FileInputStream对象中的方法read读取文件
  4. 使用FileOutputStream对象中的方法write,把读取到的数据写入到目的地中
  5. 释放资源(先关写,后关读)

注意:

  1. 使用一次读取多个字节,写入多个字节的方式,可大幅提高效率
  2. 可根据电脑配置和内存使用情况,调整byte数组的大小在一定范围之内,byte数组越大,效率越高。超过这个范围,内存占用空间过大,会导致效率降低。

效率测试:56.4 MB (59,176,862 字节) 复制文件共耗时为659ms

代码示例:

public class Demo01 {
    public static void main(String[] args) throws IOException {
        long s = System.currentTimeMillis();
        //1.创建文件字节输入流的FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("d:\\jdk-11中文api修订版.CHM");
        //2.创建文件字节输出流FileOutputStream对象,构造方法中绑定要写入的目的地
        FileOutputStream fos = new FileOutputStream("e:\\jdk-11中文api修订版.CHM");
        //一次读取一个字节,写一个字节的方式复制文件
        //3.使用FileInputStream对象中的方法read读取文件
//        int len = 0;
//        while((len = fis.read())!=-1){
//        //4.使用FileOutputStream对象中的方法write,把读取到的数据写入到目的地中
//            fos.write(len);
//        }
        //一次读取一个字节,效率太慢!
        //使用一次读取多个字节,写入多个字节的方式
        byte[] bytes = new byte[1024*120];
        int len = 0;
        while((len = fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        //5.释放资源(先关写,后关读)
        fos.close();
        fis.close();

        long e = System.currentTimeMillis();
        System.out.println("复制文件共耗时:"+(e-s)+"ms");

    }
}

缓冲流模拟复制粘贴(更高效)

使用缓冲流复制文件:效率高

使用步骤

  1. 创建字节缓冲输入流BufferedInputStream对象,构造方法传递FileInputStream对象
  2. 创建字节缓冲输入流BufferedOutputStream对象,构造方法传递FileOutputStream对象
  3. 使用BuffedInputStream对象的方法read,读取文件
  4. 使用BufferedOutputStream对象的方法write,把读取的数据写入缓冲区
  5. 释放资源(会先刷新)

效率测试:56.4 MB (59,176,862 字节) 复制文件共耗时为164ms

代码示例:

public class Demo02 {
    public static void main(String[] args) throws IOException {
        long s = System.currentTimeMillis();
        //1.创建字节缓冲输入流BufferedInputStream对象,构造方法传递FileInputStream对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\jdk-11中文api修订版.CHM"));
        //2.创建字节缓冲输入流BufferedOutputStream对象,构造方法传递FileOutputStream对象
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:\\jdk-11中文api修订版.CHM"));

        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }
        //5.释放资源(先关写,后关读)
        bos.close();
        bis.close();


        long e = System.currentTimeMillis();
        System.out.println("复制文件共耗时:"+(e-s)+"ms");
    }
}
发布了36 篇原创文章 · 获赞 44 · 访问量 6706

猜你喜欢

转载自blog.csdn.net/Sakuraaaaaaa/article/details/104409298