栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

用Java模拟实现对系统文件以目录的拷贝功能

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用Java模拟实现对系统文件以目录的拷贝功能

要用Java对单个文件拷贝的话,其实思路很简单,循环读取被拷贝文件,放入byte数组,然后写入目标文件。当然我们也可以借助现有的类去完成,如InputStream中的transferTo()方法就可以实现,其实我们查看源码就能看出来,其实官方的做法也是这样,只不过更严谨一些:

那么我想拷贝多个文件呢?他们显示在不同的目录中,而且目标目录中还不一定存在,比如说,
现在我想把jdk8.0的官方源码src文件复制一份到D盘,现在这个文件在桌面,里面文件结构相当复杂了

那这如何做呢?我们当然可以借助组件,一些组件很好的帮我们实现了这个功能。但我喜欢先自己做一遍。
这里我分享我的思路以及实现结果:
全部代码如下:

package day_12_15.copy_dir;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class CopyDir {
    //存放绝对路径以及文件名
    public static Map map = new HashMap<>();

    

    
    public static boolean copyDir(File copyOut, File copyIn) {
        //如果被拷贝的文件不存在直接退出
        if (!copyOut.exists()) {
            return false;
        }
        //如果目标文件存在但是是文件
        if (copyIn.exists() && copyIn.isFile()) {
            //如果被拷贝对象也是文件
            if (copyOut.isFile()) {
                copyFile(copyOut, copyIn);
                return true;
            } else {
                //否则返回false,因为目录不能往文件中拷贝
                return false;
            }
        } else {
            //如果目标路径不存在,直接创建一个空的以便之后操作
            copyIn.mkdirs();
        }

        //获取路径存入map
        getFilePath(copyOut);
        //取出key放入list
        List list = new ArrayList<>(map.keySet());
        for (String s : list) {
//            System.out.println(s);
            //截取路径头尾,只保留子目录
            String start = s.replace(copyOut.getAbsolutePath(), "");
            String end = start.replace(map.get(s), "");
            //将子目录拼接在目标路径后面
            String path = copyIn.getAbsolutePath() + end;
            File file = new File(path);
            //创建子目录
            if (!file.exists()) {
                file.mkdirs();
            }
            //最后在拼接上文件名(map的value)
            String finalPath = path + map.get(s);
//            System.out.println(finalPath);
            //先创建空文件
            try {
                new File(finalPath).createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //拷贝到空文件
            copyFile(new File(s), new File(finalPath));
        }
        return true;
    }

    
    private static void getFilePath(File file) {
        if (file.exists()) {
            if (file.isFile()) {
                map.put(file.getAbsolutePath(), file.getName());
            } else if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (File f : files) {
                    getFilePath(f);
                }
            }
        }
    }

    
    private static void copyFile(File a, File b) {
        //在copyDir()中判断过文件是否存在,所以不在判断
        if (!b.exists()) {
            try {
                b.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try (InputStream is = new FileInputStream(a); OutputStream os = new FileOutputStream(b)) {
            //实现对文件a的复制拷贝
            is.transferTo(os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试实现,我要将src复制在这里(现在这里没有):

package day_12_15.copy_dir;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class CopyDirTest {
    public static void main(String[] args) {
        File f1 = new File("C:\Users\soberw\Desktop\src");
        File f3 = new File("d:\src");
        System.out.println(CopyDir.copyDir(f1, f3));
    }
}

拷贝成功!

这里给大家安利一个组件,他可以很方便的帮我们实现这些comments-io

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666034.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号