文件夹的复制 io的概念

什么是io流

字面意思就是Input和output。
java io是用来实现数据的传输与保存的操作,吧一部分数据转移到另一部分,里面各种各样的类只是为了方便处理各种数据。
image

  • 图片的解释
    1.左右是数据的源头和目的地,java中一般体现为File文件
    2.当我们new了一个新的输入流并且传入了源头路径,相当于管道也源头连接,但是仍有水龙头阻塞数据
    3.new一个新的输出流并设定了目标路径,相当于管道和目的地连接了起来,但是仍有水龙头阻塞数据
    4.当我们使用输入流的read方式,数据就打开水龙头流入了给定的量进入管道
    5.使用输出流的write方法,数据就打开水龙头流入了目的地。
    6.4和5步骤循环就吧数据复制了过去(源文件仍存在)。
    7.使用flush方法,相当于清空管道,保证数据全部转移。
    8.使用close方法,分别关闭输出流,输入流。把管道关闭,资源还给服务器。
    9.字节流,字符流,FIle流,都只是为了处理不同的数据而已。
    image

file的关系

可以看到,流和文件必须联合起来才能传输(管道和目的地)。

File的构造方法

image

   //给出一个路径,创建一个该路径的文件夹对象
        File file = new File("D:\\bapp\\test.xlsx");
        //得到该层文件或目录的名称 test.xlsx
        String fileName = file.getName();
        //得到父级目录 D:/bapp
       String parentFile =  file.getParent();
        //得到父级的文件或文件夹对象 D:/bapp
       File parenFile = file.getParentFile();

        //F:\Java项目\springBJPowerNode\D\zyy --相对路径
        File file2 = new File("D","zyy");

        //D:\zyy\a\b  带盘符,当作d盘
        File file3 = new File("D:","/zyy/a/b/c/");

        //判断是否为文件夹 false
        boolean directory =  file.isDirectory();
        //判断是否为文件 true
        boolean myFile = file.isFile();
        if (!file3.exists()){
            //mkdir只能创建一层目录,多层目录无法创建。D:\zyy
            //mkdirs可以创建多层,D:\zyy\a\b
            // 但是只能创建目录,不能创建文件
            file3.mkdirs();
        }

        File file4 = new File("D:/zyy/a/b/c/hah.txt");
        //该方法是为了创建文件,但是之前必须要存在想要创建文件的目录。
        file4.createNewFile();
		
		 //file3必须是一个文件夹,不能是文件(文件就确定了,也没有下一级了)
		 //得到该路径下一级的所有文件或文件夹。
            File[] files = file3.listFiles();
            for(File f: files){
                //只会得到该路径下一级的所有文件或文件夹
                System.out.println(f);
            }

        //删除该文件夹
        file3.delete();

文件夹的复制

  • 思路
    1. 材料准备
      • 源文件夹
      • 想要复制的目的地文件夹
      • 输入流
      • 输出流
    2. 方法准备
      • 递归文件夹,找到各个文件进行复制。
    3. 步骤
      1. 创建源文件对象,目标文件夹对象
      2. 创建输入输出流
      3. 通过递归找到各个源文件(创建一个文件夹的递归方法)
      4. 输入流读取源文件到流管道
      5. 输出流把数据写入目标文件夹
      6. 通过循环,读取所有文件
      7. 刷新,关闭输出流,关闭输入流

实现方式1

public static void main(String args[]) throws IOException {
       //复制的源文件夹
        File srcFile = new File("D:/xxx/Downloads/Compressed");
        // 复制的目标文件夹
        File desFile = new File("E:/zyy/a");
        //复制的方法
        copyDir(srcFile,desFile);

    }
    private static void copyDir(File srcFile,File desFile) {
        //如果当前file是文件,就返回
        if(srcFile.isFile()){
            //进行文件的复制
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                //得到写的目标路径
                String path = (desFile.getAbsolutePath().endsWith("\\")?desFile.getAbsolutePath():desFile.getAbsolutePath()+"\\")+srcFile.getAbsolutePath().substring(3);
                fis = new FileInputStream(srcFile);
                fos = new FileOutputStream(path);
                //byte数组用来承载数据
                byte[] bytes = new byte[1024*1024];
                int readCount=0;
                //把数据读到byte数组里面
                while((readCount = fis.read(bytes)) != -1){
                    //把byte数组里面的数据写出去,读多少写多少
                    fos.write(bytes,0,readCount);
                    fos.flush();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                //分别关闭
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }

        //找到目录中的文件,如果是文件进行复制
        File[] files = srcFile.listFiles();
        for(File file : files){
            //获取文件的绝对路径(包括文件夹和文件)
            //在目标文件夹后面新建复制过来的文件夹
            if(file.isDirectory()){
                //前面是父路径,后面是源文件截取掉盘符
                File desDir = new File(desFile,file.getAbsolutePath().substring(2));
                System.out.println(desDir.getAbsolutePath());
                if(!desDir.exists()){
                   desDir.mkdirs();
               }
            }
//            System.out.println(file.getAbsolutePath());
            //不是文件,继续循环遍历,当前file
            copyDir(file,desFile);
        }

实现方式2

public static void main(String[] args) {
        //复制的源文件夹
        File src = new File("D:/xxx/Downloads/Compressed");
        // 复制的目标文件夹
        File desFile = new File("E:/xsq/a");
        copyDir(src, desFile);
    }

    public static void copyDir(File src, File dest) {
        if(src.isDirectory()){
            File temp=new File(dest,src.getName());
            temp.mkdirs();
            for (File file : src.listFiles()) {
                copyDir(file, temp);
            }
        }else{
            copyFile(src, new File(dest,src.getName()));
        }
    }

    /**
     * 拷贝文件
     * @param src
     * @param dest
     */
    public static void copyFile(File src, File dest) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(src);
            out = new FileOutputStream(dest);
            byte[] b = new byte[1024];
            int len = 0;
            while (-1 != (len = in.read(b))) {
                out.write(b, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
posted @ 2021-06-02 22:06  力量源于练习  阅读(106)  评论(0)    收藏  举报