分享

JAVA中比较两个文件夹不同的方法

 wenxuefeng360 2022-07-26 发布于四川
复制代码
 1 public class TestFolderCompare {
 2 
 3     /**
 4      * 根据路径获取所有的文件夹和文件,及文件的md5值
 5      * @param path 路径
 6      */
 7     private static Map<String, FileModel> getFiles(String path) throws IOException {
 8         Map<String, FileModel> map = new HashMap<String, FileModel>();
 9         File folder = new File(path);
10         Object[] files = getFileList(folder).toArray();
11         Arrays.sort(files);
12         for (Object obj : files) {
13             File file = (File) obj;
14             // 去掉根目录,正则的\\\\,转义为java的\\,再转义为\
15             String key = file.getAbsolutePath().replaceAll("\\\\", "/").replaceAll(path, "");
16             String md5 = "";// 文件夹不比较md5值
17             if (file.isFile()) {
18                 md5 = DigestUtils.md5Hex(new FileInputStream(file));
19             }
20             FileModel fileModel = new FileModel(file, md5);
21             map.put(key, fileModel);
22         }
23         return map;
24     }
25 
26     /**
27      * 递归获取路径下所有文件夹和文件
28      * @param folder 文件路径
29      */
30     private static List<File> getFileList(File folder) {
31         List<File> list = new ArrayList<File>();
32         File[] files = folder.listFiles();
33         for (File file : files) {
34             list.add(file);
35             if (file.isDirectory()) {
36                 List<File> fileList = getFileList(file);
37                 list.addAll(fileList);
38             }
39         }
40         return list;
41     }
42 
43     /**
44      * 比较两个文件集合的不同
45      * @param fileMap1 文件集合
46      * @param fileMap2 文件集合
47      */
48     public static List<FileModel> compareFile(Map<String, FileModel> fileMap1, Map<String, FileModel> fileMap2) {
49         List<FileModel> list = new ArrayList<FileModel>();
50         for (String key : fileMap1.keySet()) {
51             FileModel fileModel1 = fileMap1.get(key);
52             FileModel fileModel2 = fileMap2.get(key);
53             // 将fileMap2中没有的文件夹和文件,添加到结果集中
54             if (fileModel2 == null) {
55                 list.add(fileModel1);
56                 continue;
57             }
58             // 文件的md5值不同则add到比较结果集中
59             if (fileModel1.getFile().isFile() && !fileModel1.getMd5().equals(fileModel2.getMd5())) {
60                 list.add(fileModel1);
61             }
62         }
63         return list;
64     }
65 
66     public static void main(String[] args) throws IOException {
67         String path1 = "c:/a1";
68         String path2 = "c:/a2";
69         // 获取路径下所有文件夹和文件,及文件的md5值
70         Map<String, FileModel> fileMap1 = getFiles(path1);
71         Map<String, FileModel> fileMap2 = getFiles(path2);
72         List<FileModel> resultList = new ArrayList<FileModel>();
73         // 得到fileMap2中没有的文件夹和文件,及md5值不同的文件
74         resultList.addAll(compareFile(fileMap1, fileMap2));
75         // 得到fileMap1中没有的文件夹和文件,及md5值不同的文件
76         resultList.addAll(compareFile(fileMap2, fileMap1));
77         // 输出最终结果
78         for (FileModel fileModel : resultList) {
79             System.out.println(fileModel.getFile().getAbsolutePath() + " " + fileModel.getMd5());
80         }
81     }
82 }
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多