Java基础-IO流-文件复制的四种方式

Java工程师知识树 / Java基础


文件复制的四种方式

以图片文件为例:

  1. FileInputStreamFileOutputStream组合,读取图片文件到输入流中,输入流遍历,循环写入输出流信息,输出流指向文件并生成文件
  2. FileInputStreamFileOutputStream组合之后,再通过BufferedInputStreamBufferedOutputStream包装,然后再进行读取写入操作。
    使用InputStreamOutputStream复制文件的步骤为:
    1. 创建一个字节输入流对象,构造方法中绑定要读取的数据源
    2. 创建一个字节输出流对象,构造方法中绑定要写入的目的地
    3. 使用字节输入流对象中的方法read读取文件
    4. 使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
    5. 释放资源
  3. 使用工具类,例如:hutool工具FileUtil.copyFilesFromDir();底层使用的是java.nio.file.Files.copy()
  4. 使用NIO复制FileChannel.transferFrom方法
import cn.hutool.core.io.FileUtil;

import java.io.*;
import java.nio.channels.FileChannel;

public class CopyFile {

    public static void main(String[] args) {
        File fileCopyFileStream = new File("E:\\document\\io\\深入Nginx100讲脑图_copyFileStream.jpg");
        File fileCopyBufferedFileStream = new File("E:\\document\\io\\深入Nginx100讲脑图_copyBufferedFileStream.jpg");
        File fileCopyHutool = new File("E:\\document\\io\\深入Nginx100讲脑图_hutool.jpg");
        File fileCopyNio = new File("E:\\document\\io\\深入Nginx100讲脑图_nio.jpg");

        if (fileCopyFileStream.exists()) {
            try {
                fileCopyFileStream.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        File file = new File("E:\\document\\io\\深入Nginx100讲脑图.jpg");

        long start1 = System.currentTimeMillis();
        fileCopyFileStream(file,fileCopyFileStream);
        long hTime = System.currentTimeMillis() - start1;

        System.out.println("不使用Buffered所花时间:"+hTime);
        long start3 = System.currentTimeMillis();
        fileCopyBufferedFileStream(file,fileCopyBufferedFileStream);
        long hbTime = System.currentTimeMillis() - start3;
        System.out.println("使用Buffered所花时间:"+hbTime);

        long start5 = System.currentTimeMillis();
        FileUtil.copyFilesFromDir(file, fileCopyHutool, true);
        long huTime = System.currentTimeMillis() - start5;
        System.out.println("使用hutool工具所花时间:"+huTime);// 底层使用java.nio.file.Files.copy()方法

        long start7 = System.currentTimeMillis();
        copyByNio(file,fileCopyNio);
        long nioTime = System.currentTimeMillis() - start7;
        System.out.println("使用NIO所花时间:"+nioTime);
    }

    public static void fileCopyFileStream(File file,File fileCopyFileStream) {

        try (
                FileInputStream inputStream = new FileInputStream(file);
                FileOutputStream outputStream = new FileOutputStream(fileCopyFileStream)
        ) {
            byte[] arr = new byte[1024];
            int len ;
            while ((len = inputStream.read(arr)) != -1) {
                outputStream.write(arr, 0, len);
            }
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void fileCopyBufferedFileStream(File file,File fileCopyFileStream) {

        try (
                FileInputStream fis = new FileInputStream(file);
                BufferedInputStream bufferedInputStream = new BufferedInputStream(fis);
                FileOutputStream fos = new FileOutputStream(fileCopyFileStream);
                BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fos)
        ) {
            byte[] arr = new byte[1024];
            int len ;
            while ((len = bufferedInputStream.read(arr)) != -1) {
                bufferedOutputStream.write(arr, 0, len);
            }
            bufferedOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void copyByNio(File file,File fileCopyNio) {

        try(
                FileInputStream fileInputStream = new FileInputStream(file);
                FileOutputStream fileOutputStream = new FileOutputStream(fileCopyNio);
        ) {
            FileChannel input =  fileInputStream.getChannel();
            FileChannel output =  fileOutputStream.getChannel();
            output.transferFrom(input, 0, input.size());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

打印结果:

不使用Buffered所花时间:57
使用Buffered所花时间:20
使用hutool工具所花时间:77
使用NIO所花时间:8

复制结果:


将上面的图片文件[深入Nginx100讲脑图.jpg]改成视频文件[微信操作服务器上的应用程序.avi]后

执行结果:

不使用Buffered所花时间:3029
使用Buffered所花时间:667
使用hutool工具所花时间:276
使用NIO所花时间:234

复制结果:

总结:日常工作中推荐使用hutool工具类或者NIO操作文件,文本文件推荐使用带缓存输入输出流操作文件。

你可能感兴趣的:(Java基础-IO流-文件复制的四种方式)