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 }