首页 > 解决方案 > 在JAVA中比较两个BIG文本文件内容的最快方法是什么

问题描述

我有两个超过 600MB 的文本文件,如果它们相同,我想比较它们的内容(忽略末尾的任何空格或其中任何行的开头,即trim()每一行)。我正在考虑将它们的每一行作为字符串读取,然后对其进行修剪并进行比较。

有没有更好的想法,如果没有,最快的实现是什么?提前致谢。

标签: javaperformancetext-files

解决方案


如果要比较文件是否一致,请计算文件md5值进行比较:</p>

import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class MainServer {
  public static void main(String[] args) {
    String filePath1 = "D:\\Download\\a.mp3";
    String filePath2 = "D:\\Download\\b.mp3";
    String file1_md5 = md5HashCode(filePath1);
    String file2_md5 = md5HashCode(filePath2);

    System.out.println(file1_md5);
    System.out.println(file2_md5);
    if(file1_md5.equals(file2_md5)){
        System.out.println("Two files are the same ");
    }
}

/**
 * get file md5 value
 */
 public static String md5HashCode(String filePath) {
    try {
        InputStream fis =new FileInputStream(filePath);
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] buffer = new byte[1024];
        int length = -1;
        while ((length = fis.read(buffer, 0, 1024)) != -1) {
            md.update(buffer, 0, length);
        }
        fis.close();
        byte[] md5Bytes  = md.digest();
        BigInteger bigInt = new BigInteger(1, md5Bytes);
        return bigInt.toString(16);
     } catch (Exception e) {
        e.printStackTrace();
        return "";
     }
  }
}

如果需要读取文件的每一行进行比较:</p>

    List<String> file1_lines = null;
    List<String> file2_lines = null;
    try {
        file1_lines = Files.readAllLines(Paths.get("D:/a.txt"), StandardCharsets.UTF_8);
        file2_lines = Files.readAllLines(Paths.get("D:/b.txt"), StandardCharsets.UTF_8);
    } catch (IOException e) {
        e.printStackTrace();
    }

    for (int i = 0; i < file1_lines.size(); i++) {
        String file1_line = file1_lines.get(i).trim();
        String file2_line = file2_lines.get(i).trim();
        if (file1_line.equals(file2_line)) {
            //do some
        }
    }

推荐阅读