需求:把“F:\\javaFT”(多级文件夹)的内容复制到G盘目录下。

思路:

一、创建数据源File对象,路径是F:\\javaFT;

二、创建目的地File对象,路径是G:\\;

三、写方法实现文件夹的复制,参数为数据源File对象和目的地File对象;

四、判断数据源File是否是目录,如果是,则:

  1. 在目的地下创建和数据源File名称一样的目录;
  2. 获取数据源File下所有文件或者目录的File数组;
  3. 遍历该File数组,得到每一个File对象;
  4. 把该File作为数据源File对象,递归调用复制文件夹的方法。

不是,则说明是文件,直接复制,用字节流。

代码实现:

package IOPackage;

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        //一、创建数据源File对象,路径是F:\\javaFT;
        File srcFile = new File("F:\\javaFT");
        //二、创建目的地File对象,路径是G:\\;
        File destFile = new File("G:\\");

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

    //复制文件夹
    private static void copyFolder(File srcFile, File destFile) throws IOException {
        //四、判断数据源File是否是目录,如果是,则:
        if(srcFile.isDirectory()){
            //在目的地下创建和数据源File名称一样的目录;
            String srcFileName = srcFile.getName(); //返回由此抽象路径名表示的文件或目录的名称
            File newFolder = new File(destFile,srcFileName);
            if(!newFolder.exists()){
                newFolder.mkdir(); //如果目录不存在,就创建由此对象路径名命名的目录,并返回true。
            }//目录已经存在时,就不创建目录,并返回false。

            //获取数据源File下所有文件或者目录的File数组;
            File[] fileArray = srcFile.listFiles(); //返回此抽象路径名表示的目录中的文件和目录的File对象数组
            //遍历该File数组,得到每一个File对象;
            for(File file:fileArray){
                //把该File作为数据源File对象,递归调用复制文件夹的方法。
                copyFolder(file,newFolder);
            }
        }else{
            //不是,则说明是文件,直接复制,用字节流。
            File newFile = new File(destFile,srcFile.getName());
            copyFile(srcFile,newFile);
        }
    }

    //字节缓冲流复制文件
    private static void copyFile(File srcFile, File destFile) throws IOException {
        //创建字节缓冲输入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        //创建字节缓冲输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

        //一次读取和写入一个字节数组的数据
        byte[] bys = new byte[1024];
        int len;
        while((len=bis.read(bys)) != -1){
            bos.write(bys,0,len);
        }

        //释放资源
        bos.close();
        bis.close();
    }
}

复制文件夹的异常处理方案:

//JDK7及之后的改进方案(如IO流)
try(定义流对象) {
    可能出现异常的代码;
}catch(异常类名 变量名){
    异常的处理代码;
}//自动释放资源

//JDK9及之后的改进方案(如IO流)
定义输入流对象;
定义输出流对象;
try(输入流对象;输出流对象) {
    可能出现异常的代码;
}catch(异常类名 变量名){
    异常的处理代码;
}//自动释放资源