|
@@ -0,0 +1,140 @@
|
|
|
+package util;
|
|
|
+
|
|
|
+import sun.security.provider.MD5;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.nio.MappedByteBuffer;
|
|
|
+import java.nio.channels.FileChannel;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.security.MessageDigest;
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class CompareFileUtil {
|
|
|
+
|
|
|
+ protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
|
|
+
|
|
|
+ protected static MessageDigest messageDigest = null;
|
|
|
+ static {
|
|
|
+ try {
|
|
|
+ messageDigest = MessageDigest.getInstance("MD5");
|
|
|
+ } catch (NoSuchAlgorithmException nsaex) {
|
|
|
+ System.err.println(MD5.class.getName()+"初始化失败,MessageDigest不支持MD5!");
|
|
|
+ nsaex.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static boolean compareTo(String filePath1, String filePath2) {
|
|
|
+ List<String> allFile = getAllFile(filePath1);
|
|
|
+ List<String> list1 = new ArrayList<>();
|
|
|
+ for (String s : allFile) {
|
|
|
+ String md5String = CompareFileUtil.getFileMD5String(new File(s));
|
|
|
+ list1.add(md5String);
|
|
|
+ }
|
|
|
+ List<String> allFile2 = getAllFile(filePath2);
|
|
|
+ List<String> list2 = new ArrayList<>();
|
|
|
+ for (String s : allFile2) {
|
|
|
+ String md5String = CompareFileUtil.getFileMD5String(new File(s));
|
|
|
+ list2.add(md5String);
|
|
|
+ }
|
|
|
+ list1.removeAll(list2);
|
|
|
+ System.out.println("比较结束,文件1" + filePath1 + ",文件2:"+ filePath2 + ",比较结果:" + (list1.size() == 0));
|
|
|
+ return list1.size() == 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<String> getAllFile(String directoryPath) {
|
|
|
+ List<String> list = new ArrayList<String>();
|
|
|
+ File baseFile = new File(directoryPath);
|
|
|
+ if (!baseFile.exists()) {
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+ if (baseFile.isFile()) {
|
|
|
+ list.add(directoryPath);
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ File[] files = baseFile.listFiles();
|
|
|
+ for (File file : files) {
|
|
|
+ if (file.isDirectory()) {
|
|
|
+ list.addAll(getAllFile(file.getAbsolutePath()));
|
|
|
+ } else {
|
|
|
+ list.add(file.getAbsolutePath());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getFileMD5String(File file) {
|
|
|
+ try {
|
|
|
+
|
|
|
+ FileInputStream in = new FileInputStream(file);
|
|
|
+ FileChannel ch = in.getChannel();
|
|
|
+
|
|
|
+
|
|
|
+ int maxSize=700000000;
|
|
|
+
|
|
|
+ long startPosition=0L;
|
|
|
+ long step=file.length()/maxSize;
|
|
|
+
|
|
|
+ if(step == 0){
|
|
|
+ MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,file.length());
|
|
|
+ messageDigest.update(byteBuffer);
|
|
|
+ return bufferToHex(messageDigest.digest());
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int i=0;i<step;i++){
|
|
|
+ MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, startPosition,maxSize);
|
|
|
+ messageDigest.update(byteBuffer);
|
|
|
+ startPosition+=maxSize;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(startPosition==file.length()){
|
|
|
+ return bufferToHex(messageDigest.digest());
|
|
|
+ }
|
|
|
+
|
|
|
+ MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, startPosition,file.length()-startPosition);
|
|
|
+ messageDigest.update(byteBuffer);
|
|
|
+
|
|
|
+
|
|
|
+ return bufferToHex(messageDigest.digest());
|
|
|
+
|
|
|
+ }catch (Exception e) {
|
|
|
+ System.out.println(e.getMessage());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getMD5String(byte[] bytes) {
|
|
|
+ messageDigest.update(bytes);
|
|
|
+ return bufferToHex(messageDigest.digest());
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String bufferToHex(byte bytes[]) {
|
|
|
+ return bufferToHex(bytes, 0, bytes.length);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String bufferToHex(byte bytes[], int m, int n) {
|
|
|
+ StringBuffer stringbuffer = new StringBuffer(2 * n);
|
|
|
+ int k = m + n;
|
|
|
+ for (int l = m; l < k; l++) {
|
|
|
+ appendHexPair(bytes[l], stringbuffer);
|
|
|
+ }
|
|
|
+ return stringbuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
|
|
|
+ char c0 = hexDigits[(bt & 0xf0) >> 4];
|
|
|
+ char c1 = hexDigits[bt & 0xf];
|
|
|
+ stringbuffer.append(c0);
|
|
|
+ stringbuffer.append(c1);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static boolean checkPassword(String password, String md5PwdStr) {
|
|
|
+ String s = getMD5String(password.getBytes(StandardCharsets.UTF_8));
|
|
|
+ return s.equals(md5PwdStr);
|
|
|
+ }
|
|
|
+}
|