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

  JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同。具体例子如下:

 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 }

 

用到的文件model

 1 public class FileModel {
 2     public File file;
 3     public String md5;
 4 
 5     public FileModel(File file, String md5) {
 6         this.file = file;
 7         this.md5 = md5;
 8     }
 9     public File getFile() {
10         return file;
11     }
12     public void setFile(File file) {
13         this.file = file;
14     }
15     public String getMd5() {
16         return md5;
17     }
18     public void setMd5(String md5) {
19         this.md5 = md5;
20     }
21 }

 

posted @ 2017-10-19 19:02  PC君  阅读(5831)  评论(4编辑  收藏  举报