欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

将规定目录下全部内容拷贝到指定目录下

程序员文章站 2022-03-04 14:23:57
...

将规定目录下全部内容拷贝到指定目录下,代码附有详细注解,综合运用IO流,文件类方法,递归算法

package test;

import java.io.*;

public class IoCopy {
    public static void main(String[] args) {
        //源文件位置
        File srcFile = new File("D:\\IDEAproject\\javase\\new\\out\\production\\new");
        //目标文件位置
        File destFile = new File("C:\\aa");
        copyMethod(srcFile, destFile);
    }
    private static void copyMethod(File srcFile, File destFile) {
        //如果源文件是文件类型,则...
        if(srcFile.isFile()){
            //设置路径为目标文件路径加上(源文件路径剪去前四个字符),即剪去"d:\\"
            String path = (destFile.getAbsolutePath().endsWith("\\")? destFile.getAbsolutePath() :
                    destFile.getAbsolutePath() + "\\") + srcFile.getAbsolutePath().substring(3);
                    /*//File eachFile = new File(path);
                    //eachFile.getParent();*/
            //尝试输入流读取,将流的创建放在try参数里,待到catch结束可自动关闭流,JDK7之后的新特性
            try(FileInputStream fis = new FileInputStream(srcFile)) {
                //FileOutputStream可自动创建文件
                try(FileOutputStream fos = new FileOutputStream(path)){
                    //创建数组
                    byte[] bytes = new byte[1024 * 1024];
                    int readCount  ;
                    //将读出来的字节赋给readCount,读完之后返回-1,跳出循环
                    while ((readCount = fis.read(bytes)) != -1) {
                        fos.write(bytes,0,readCount);
                    }
                    //刷新输出流
                    fos.flush();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
        //将源文件目录的所有文件放在一个文件数组里
        File[] files = srcFile.listFiles();
        //遍历源文件目录下的文件
        for(File f :files){
            //如果文件f还是一个目录,则...
            if(f.isDirectory()){
                //获取f的绝对路径
                String srcDir = f.getAbsolutePath();
                //获得目标目录为main方法里的目标目录加上(源文件绝对路径剪去“D:\\”)
                String destDir = (destFile.getAbsolutePath().endsWith("\\")? destFile.getAbsolutePath() :
                        destFile.getAbsolutePath() + "\\") + srcDir.substring(3);

                File newFile = new File(destDir);
                //创建目录
                if(!newFile.exists()){
                    newFile.mkdirs();
                }
                System.out.println(destDir);
            }
            /**以f作为实参调用自己,递归还是画图比较好理解,可以自己画一下压栈和弹栈图,
             * 每调用一个方法就压栈一次,每次调用完该方法就弹栈出来,程序返回到前一次压栈点,
             * 所以栈内存遵循先进后出和后进先出原则,就像是子弹夹...
             * 一个标准的程序运行是以压栈main方法作为开始标志,以弹栈main方法作为结束标志。
            */
            copyMethod(f,destFile);
        }

    }


}

模仿老师写的代码,自己琢磨了许久感觉理解透彻了,然后改善了一下代码,运行正确才写的注释。。。

相关标签: Java se java