这个例子算是java Io流当中较为经典的例子,值得细细去品味,代码我也是敲了两边,详细的注释都在代码上面,可以仔细看代码去体会这个过程
觉得最难的就是:
一:面向对象思想的训练以及培养,降低程序的耦合度
二:获取了源目标的文件(里面可能包含目录,以及文件),获取到目录和文件容易,可是怎么在指定文件夹下新建这个目录,
三:递归的应用,获取的如果是目录,就自身调用自身在去获取这个目录下的文件的绝对路径,如果是文件,就结束
四:涉及到字符串的拼接,要把源路径的一部分截取,作为指定路径的一部分
下面直接上代码:
一:面向对象思想的培养,给一个拷贝源,一个拷贝目标,调用拷贝方法完成拷贝

public class CopyAll {
    public static void main(String[] args) {
        //拷贝源
        File srcFile=new File("D:\\练习java源文件");
        //拷贝目标
        File destFile=new File("C:\\");
        //拷贝方法
        copyDir(srcFile,destFile);
    }

进行拷贝:

/**
     *
     * @param srcFile 拷贝源
     * @param destFile 拷贝目标
     */
    private static void copyDir(File srcFile, File destFile) {
        //判断是否是一个文件,
        // 是文件的话结束就可以了,
        // 不是文件的话往下执行,查到这个目录下的所有子目录,在递归调用
        if (srcFile.isFile()){
            //是文件的时候需要拷贝
            //一边读一边写
            FileInputStream in=null;
            FileOutputStream out=null;
            try {
                //读这个文件
                in=new FileInputStream(srcFile);
                //写到这个文件当中
                String path= (destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath():destFile.getAbsolutePath()+"\\")+srcFile.getAbsolutePath().substring(3);
                out=new FileOutputStream(path);
                byte[] bytes=new byte[1024*1024];//一兆
                int readCount=0;
                while ((readCount=in.read(bytes))!=-1){
                    out.write(bytes,0,readCount);
                }
                //刷新流
                out.flush();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (in != null) {
                    //关闭流
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                //关闭流
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
            return;
        }
        //程序执行到此处,说明不是一个文件,是一个目录,
        //获取源目标下的所有子目录
        File[] files= srcFile.listFiles();
        //获取到的file可能是一个文件,也可能是一个目录
        for (File file:files){
            //获取文件(包括目录和文件)的绝对路径
            //System.out.println(file.getAbsoluteFile());
            //如果,获取的file是一个目录的话,就在拷贝目标新建一个对应的目录
            if (file.isDirectory()){
                //源目录
                String srcDir=file.getAbsolutePath();
                //目标目录
                //如果目录是以\结尾的,就不加,不是以\结尾的,通过字符串拼接加上去
                String distDir=(destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath():destFile.getAbsolutePath()+"\\")+srcDir.substring(3);
                System.out.println(distDir);
                //新建拷贝目录
               File newFile=new File(distDir);
                //如果这个目录不存在
                if (!newFile.exists()){
                    //就以 多重目录的形式新建出来
                    newFile.mkdirs();
                }
            }
            //递归调用。
            copyDir(file,destFile);
        }
    }

}

以上就完成了对文件目录的拷贝,一起加油!