java对比两个文件夹下面的文件和文件夹是否完全相同
FilesCompareUtils.java
import com.google.common.collect.MapDifference;
import com.google.common.collect.MapDifference.ValueDifference;
import com.google.common.collect.Maps;
public class FilesCompareUtils {
public static void main(String[] args) {
FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File file) {
return !(".svn".equals(file.getName()) || "target".equals(file.getName())
|| "bin".equals(file.getName()) || ".project".equals(file.getName())
|| ".settings".equals(file.getName()) || "classes".equals(file.getName())
|| file.getName().endsWith(".class"));
}
};
String leftPath = "D:/left";
String rightPath = "D:/right";
MapDifference<String, String> difference = difference(leftPath, rightPath, fileFilter);
if (difference.areEqual()) {
System.out.println("两个路径下文件完全相同!");
} else {
System.out.println("两个路径下文件差异:");
System.out.println("------OnlyOnLeft size: " + difference.entriesOnlyOnLeft().size() + ", " + leftPath);
difference.entriesOnlyOnLeft().entrySet().forEach(System.out::println);
System.out.println("-----OnlyOnRight size: " + difference.entriesOnlyOnRight().size() + ", " + rightPath);
difference.entriesOnlyOnRight().entrySet().forEach(System.out::println);
System.out.println("-------Differing size: " + difference.entriesDiffering().size());
difference.entriesDiffering().entrySet().forEach(System.out::println);
}
}
private static MapDifference<String, String> difference(String leftPath, String rightPath, FileFilter fileFilter) {
Map<String, String> left = getAllFilesMD5(leftPath, fileFilter);
Map<String, String> right = getAllFilesMD5(rightPath, fileFilter);
return Maps.difference(left, right);
}
private static Map<String, String> getAllFilesMD5(String dirPth, FileFilter fileFilter) {
Map<String, String> map = new HashMap<String, String>();
int index = dirPth.length();
List<File> allFiles = FilesUtils.getAllFiles(dirPth, fileFilter);
for (File file : allFiles) {
if (file.isDirectory()) {
map.put(file.getPath().substring(index), "isDir");
} else {
map.put(file.getPath().substring(index), MD5Utils.md5(file));
}
}
return map;
}
}
FilesUtils.getAllFiles(String path, FileFilter fileFilter)
public class FilesUtils {
public static List<File> getAllFiles(String path, FileFilter fileFilter) {
List<File> allFiles = new ArrayList<File>();
File file = new File(path);
if (file.exists()) {
List<File> fileList = new ArrayList<File>();
fileList.add(file);
while (fileList.size() > 0) {
allFiles.addAll(fileList);
fileList = getNextLevelFiles(fileList, fileFilter);
}
}
return allFiles;
}
private static List<File> getNextLevelFiles(List<File> fileList, FileFilter fileFilter) {
List<File> nextLevelFiles = new ArrayList<File>();
for (File file : fileList) {
if (file.isDirectory()) {
File[] childs = listFiles(file, fileFilter);
if (childs != null) {
for (File child : childs) {
nextLevelFiles.add(child);
}
}
}
}
return nextLevelFiles;
}
private static File[] listFiles(File file, FileFilter fileFilter) {
return fileFilter == null ? file.listFiles() : file.listFiles(fileFilter);
}
}
MD5Utils.java
public class MD5Utils {
private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
'f' };
public static String md5(String text, String salt) {
return (text != null && salt != null) ? md5(text + salt) : md5(text);
}
public static boolean verify(String text, String salt, String md5) {
return md5(text, salt).equalsIgnoreCase(md5);
}
public static String md5(String input) {
if (input == null) {
return null;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] inputByteArray = input.getBytes(StandardCharsets.UTF_8);
md5.update(inputByteArray);
byte[] resultByteArray = md5.digest();
return byteArrayToHex(resultByteArray);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static String md5(File file) {
try (FileInputStream fis = new FileInputStream(file)) {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[8192];
int len;
while ((len = fis.read(buffer)) != -1) {
md5.update(buffer, 0, len);
}
return byteArrayToHex(md5.digest());
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private static String byteArrayToHex(byte[] byteArray) {
char charArray[] = new char[byteArray.length * 2];
int index = 0;
for (byte b : byteArray) {
charArray[index++] = HEX_CHARS[(b >>> 0x4) & 0xf];
charArray[index++] = HEX_CHARS[b & 0xf];
}
return new String(charArray);
}
private static String byteArrayToHexOld1(byte[] byteArray) {
StringBuilder sb = new StringBuilder();
for (byte b : byteArray) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
private static String byteArrayToHexOld2(byte[] byteArray) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < byteArray.length; i++) {
int var = byteArray[i] & 0xff;
if (var < 16)
sb.append("0");
sb.append(Integer.toHexString(var));
}
return sb.toString();
}
}