Quellcode durchsuchen

比较文件工具类

luxueshi vor 3 Jahren
Commit
582f499cb4
3 geänderte Dateien mit 214 neuen und 0 gelöschten Zeilen
  1. 16 0
      pom.xml
  2. 58 0
      src/main/java/Test.java
  3. 140 0
      src/main/java/util/CompareFileUtil.java

+ 16 - 0
pom.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.example</groupId>
+    <artifactId>compareFile</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+</project>

+ 58 - 0
src/main/java/Test.java

@@ -0,0 +1,58 @@
+import util.CompareFileUtil;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class Test {
+
+    //每隔10秒打印一次,文件目录的比较结果
+
+    /**
+     * 每隔10秒打印一次,文件目录的比较结果
+     * path1 path2支持传递目录,比较目录下所有文件是否内容一致。一致返回true,不一致返回false
+     * @param args
+     */
+    public static void main(String[] args) {
+        String path1 = "D:\\data\\test1";
+        String path2 = "D:\\data\\test2";
+        TestThread testThread = new TestThread(path1, path2);
+        testThread.start();
+    }
+
+    static class TestThread extends Thread {
+        private String path1;
+        private String path2;
+
+        public TestThread(String path1,String path2) {
+            this.path1 = path1;
+            this.path2 = path2;
+        }
+
+        @Override
+        public void run() {
+            while (true) {
+                try {
+                    TimeUnit.SECONDS.sleep(10);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                long begin = System.currentTimeMillis();
+                try {
+                    CompareFileUtil.compareTo(path1,path2);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                long end = System.currentTimeMillis();
+                System.out.println(end - begin);
+            }
+        }
+    }
+
+
+}

+ 140 - 0
src/main/java/util/CompareFileUtil.java

@@ -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();
+
+            //700000000 bytes are about 670M
+            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);
+    }
+}