Java中文件夹的复制

文件夹的复制


前言

在Java中,复制文件夹,需要用到的是IO流技术。下面我将分别介绍单级文件夹和多级文件夹的复制。


一、单级文件夹的复制

(文件夹里面只有文件 不包含子文件夹)
将"E:\english"这个文件夹复制到E:\CloudMusic目录下

需求:把"E:\english"这个文件夹复制到E:\CloudMusic目录下。
思路:

  1. 创建数据源目录File对象,路径是E:\english
  2. 获取数据源目录File对象的名称(english)
  3. 创建目的地目录File对象,路径名是目的地目录+english组成:E:\CloudMusic\english
  4. 判断目的地目录对应的File是否存在,如果不存在,就创建
  5. 获取数据源目录下所有文件的File数组
  6. 遍历File数组,得到每一个File对象,其实就是数据源文件
  7. 获取数据源文件File的名称(mn.jpg)
  8. 创建目的地文件File对象,路径名是目的地目录+mn.jpg组成:E:\CloudMusic\english\mn.jpg
  9. 复制文件

由于文件不仅仅是文本文件,还有图片,所以采用字节流复制文件

1.main方法

代码如下(示例):

 public static void main(String[] args) throws IOException {
        //创建数据源目录File对象,路径是E:\english
        File srcFolder = new File("E:\\english");
        //获取数据源目录File对象的名称(english)
        String srcFolderName = srcFolder.getName();
        //创建目的地目录File对象,路径名是目的地目录+english组成E:\\CloudMusic\\english
        File destFolder = new File("E:\\CloudMusic", srcFolderName);
        // 判断目的地目录对应的File是否存在,如果不存在,就创建
        if (!destFolder.exists()) {
           destFolder.mkdir();
        }
        //获取数据源目录下所有文件的File数组
        File[] listFiles = srcFolder.listFiles();
        //遍历File数组,得到每一个File对象,其实就是数据源文件
        for (File srcFile : listFiles) {
            String srcFileName = srcFile.getName();
            // 创建目的地文件File对象,路径名是目的地目录+mn.jpg组成E:\\CloudMusic\\english\\mn.jpg
            File destFile = new File(destFolder, srcFileName);
            //复制文件
            copyFile(srcFile, destFile);
        }
    }

2.字符缓冲流复制文件

代码如下(示例):

public static void copyFile(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
        byte[] bytes = new byte[1024];
        int length;
        while ((length = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, length);
        }
        bis.close();
        bos.flush();
        bos.close();
    }

运行结果如下:

E盘下的english文件夹
程序运行之后E盘CloudMusic文件夹下的english文件夹

二、多级文件夹的复制

(文件夹里面包含子文件夹 子文件夹里面也可能包含子文件夹)

需求:把"E:\english"复制到F盘目录下

思路:

  1. 创建数据源File对象,路径是E:\english
  2. 创建目的地File对象,路径是F:\
  3. 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
  4. 判断数据源File对象是否是目录
    是:
    1. 在目的地下创建和数据源File名称一样的目录
    2. 获取数据源File下所有文件或者目录的File数组
    3. 遍历该File数组,得到每一个File对象
    4. 把该File作为数据源File对象,递归调用复制文件夹的方法
      不是:
      说明是文件,直接复制,由于文件不仅仅是文本文件,
      可能还有图片,所以采用字节流复制文件

1.main方法

代码如下(示例):

 public static void main(String[] args) throws IOException {
        //创建数据源File对象,路径是E:\english
        File srcFile = new File("E:\\english");

        //创建目的地File对象,路径是F:\\
        File destFile = new File("F:\\");

        //写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
        copyFolder(srcFile, destFile);

2.复制文件夹

代码如下(示例):

    public static void copyFolder(File srcFile, File destFile) throws IOException {
        //判断数据源File对象是否是目录
        if (srcFile.isDirectory()) {
            String srcFileName = srcFile.getName();
            //在目的地下创建和数据源File名称一样的目录
            File newFolder = new File(descFile, srcFileName);//F:\\english
            if (!newFolder.exists()) {
                newFolder.mkdir();
            }

            //获取数据源File下所有文件或者目录的File数组
            File[] fileArray = srcFile.listFiles();//返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
            //遍历该File数组,得到每一个File对象
            for (File file : fileArray) {
                //把该File作为数据源File对象,递归调用复制文件夹的方法
                copyFolder(file, newFolder);
            }

        } else {
            //不是,说明是文件,直接复制,采用字节流复制文件
            File newFile = new File(destFile, srcFile.getName());
            copyFile(srcFile, newFile);

        }
    }

3.字符缓冲流复制文件

代码如下(示例):

public static void copyFile(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
        byte[] bytes = new byte[1024];
        int length;
        while ((length = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, length);
        }
        bis.close();
        bos.flush();
        bos.close();
    }

运行结果如下:
E盘下的english文件夹
程序运行后F盘下的english文件夹


总结

多级文件夹的复制,得用到递归调用。当要复制文件夹时,用listFiles()方法得到文件夹的所有File,然后用增强for循环遍历所有的File对象,再判断他们是文件夹还是文件,递归调用。

版权声明:本文为qq_45117196原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。