• 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 }
  • 相关阅读:
    XTU 1250 Super Fast Fourier Transform
    XTU 1249 Rolling Variance
    XTU 1243 2016
    CodeForces 710A King Moves
    CodeForces 710B Optimal Point on a Line
    HDU 4472 Count
    并查集
    高精度四件套
    Kruskal最小生成树
    [蓝桥杯]翻硬币(贪心的详解附带题目测试链接)
  • 原文地址:https://www.cnblogs.com/pcheng/p/7652476.html
Copyright © 2020-2023  润新知