一 需求

实现比对两个文件,第四种方法,使用 diffutils 库。

二 实例

2.1 准备

  1. 创建 maven 项目
  2. 导入 diffutils 库到 pom.xml 文件中
		<dependency>
			<groupId>com.googlecode.java-diff-utils</groupId>
			<artifactId>diffutils</artifactId>
			<version>1.2.1</version>
		</dependency>
  1. 准备 different.html 放在项目根路径下,文件内容参考: https://blog.csdn.net/fengyang182/article/details/109508007 中该文件
  2. 准备两个需要待比对的文件,我准备的是两个 xml 文件,文件内容参考 https://blog.csdn.net/fengyang182/article/details/109508007 中 xml 文件内容。准备完毕。

2.2 代码实例

import org.apache.commons.io.FileUtils;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class testDiffUtils {

    private static final String DELETION = "<span style=\"background-color: #FB504B\">${text}</span>";
    private static final String INSERTION = "<span style=\"background-color: #45EA85\">${text}</span>";

    private String left = "";
    private String right = "";


    @Test
    public void testCompare() throws IOException {
        String DELETION = "<span style=\"background-color: #FB504B\">${text}</span>";
        String INSERTION = "<span style=\"background-color: #45EA85\">${text}</span>";
        String CHANGE = "<span style=\"background-color: blue\">${text}</span>";

        String left = "</br>";
        String right = "</br>";


        List<String> original = FileUtils.readLines(new File("C:\\preconfig.xml"));
        List<String> revised = FileUtils.readLines(new File("C:\\postconfig.xml"));

        Patch patch = DiffUtils.diff(original, revised);

        for (Delta delta : patch.getDeltas()) {
            List<?> list = delta.getRevised().getLines();
            for (Object object : list) {
                System.out.println(object);
            }
        }

        DiffRowGenerator.Builder builder = new DiffRowGenerator.Builder();
        builder.showInlineDiffs(false);
        DiffRowGenerator generator = builder.build();
        for (Delta delta :  patch.getDeltas()) {
            List<DiffRow> generateDiffRows = generator.generateDiffRows((List<String>) delta.getOriginal().getLines(), (List<String>) delta
                    .getRevised().getLines());
            int leftPos = delta.getOriginal().getPosition();
            int rightPos = delta.getRevised().getPosition();
            for (DiffRow row : generateDiffRows) {
                DiffRow.Tag tag = row.getTag();
                if (tag == DiffRow.Tag.INSERT) {
                    left = left + "</br>";
                    right = right + INSERTION.replace("${text}", "" + row.getNewLine() + "</br>");
                } else if (tag == DiffRow.Tag.CHANGE) {
                    left = left + CHANGE.replace("${text}", "" + row.getOldLine() + "</br>");
                    right = right + CHANGE.replace("${text}", "" + row.getNewLine() + "</br>");
                } else if (tag == DiffRow.Tag.DELETE) {
                    left = left + DELETION.replace("${text}", "" + row.getOldLine() + "</br>");
                    right = right + "</br>";
                } else if (tag == DiffRow.Tag.EQUAL) {
                    left = left + row.getOldLine() + "</br>";
                    right = right + row.getNewLine() + "</br>";
                } else {
                    throw new IllegalStateException("Unknown pattern tag: " + tag);
                }
            }
        }

        String template = FileUtils.readFileToString(new File("difftemplate.html"), "utf-8");
        String out1 = template.replace("${left}", left);
        String output = out1.replace("${right}", right);
        // Write file to disk.
        FileUtils.write(new File("finalDiff3.html"), output, "utf-8");
        System.out.println("HTML diff generated.");
    }
}

2.3 结果

执行后会在根目录下生成 finalDiff3.html 文件,打开后显示类似:
在这里插入图片描述
这里蓝色表示更改,绿色表示比左边文件增加的,还有红色没有显示出来,表示删除的。

3 说明

该库可以很容易的比对两个文件并简单实现高亮区分显示的功能,可以实现大多数文本文档的对比(不包括 xml 文档,因为 xml 文档需要记录节点路径),简单易用,推荐使用该方法。当然同样的也可以对该库的方法进行扩展,该实例只简单展示了基本用法。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐