一 需求

实现比对两个文件,第四种方法,使用 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 = "";@Testpublic 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 文档需要记录节点路径),简单易用,推荐使用该方法。当然同样的也可以对该库的方法进行扩展,该实例只简单展示了基本用法。

java 文件比对(四)-- 使用 diffutils相关推荐

  1. java 获取包路径_java获取java文件路径的四种方法

    java获取java文件路径的四种方法 发布时间:2020-04-17 11:03:45 来源:亿速云 阅读:750 作者:小新 今天小编给大家分享的是java获取java文件路径的四种方法,很多人都 ...

  2. java 文件比较_java 四种写文件比较

    import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import ja ...

  3. 【Java文件操作(八)】将控制台输出重定向到txt文件

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  4. 【Java文件操作(七)】序列化:将自定义类写入文件

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  5. 【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\ByteArrayInputStream\FileOutputStream\FileInputStream辨析

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  6. 【Java文件操作(五)】从txt文件中读取字符串、乱码原因

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  7. 【Java文件操作(三)】递归复制文件夹内所有文件

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  8. 【Java文件操作(一)】递归打印文件目录

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java 文 ...

  9. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

  10. java 文件分隔符_Java文件分隔符

    java.io.File类包含四个静态分隔符变量.在这里,我们将了解它们以及何时使用它. File.separator:平台相关的默认名称 - 分隔符是String.对于Windows,它是'\',对 ...

最新文章

  1. Coursera台大机器学习技法课程笔记04-Soft-Margin Support Vector Machine
  2. C++构造函数和析构函数的学习(一)
  3. 使用 uiautomator2
  4. 为or、in平反——or、in到底能不能利用索引?
  5. nsstring 空值比较_用比较器的nulls排序具有空值的列表
  6. php 添加样式,添加样式到php html电子邮件
  7. [转]Reporting Service部署之访问权限
  8. android开发 问卷调查案例_Android开发Handler的简单使用——随机点名案例
  9. JSP的自定义标签(四)之定义函数
  10. Spring的核心思想,依赖注入
  11. vscode设置tab为4个空格_动图炫技23个鲜为人知的VS Code快捷键
  12. Delphi入门教程
  13. 基于python人脸光照不均匀数据的制作
  14. ENVI:影像的规则裁剪和不规则裁剪
  15. Python实时垃圾分类系统(环境教程&完整源码&数据集)
  16. 钱我所欲也,健康我所欲也,舍钱而取健康也
  17. microhard PICO900(P900)电台配置
  18. 信息化建设中的IT规划精要
  19. 今日财富杂志今日财富杂志社今日财富编辑部2022年第11期目录
  20. esp32 micropython 控制ws2812 RGB灯带

热门文章

  1. matlab数学实验二重积分的计算,matlab计算二重积分
  2. 微信小程序关于map地图
  3. 微信公众号:地图定位
  4. css 如何让盒子垂直居中,css 盒子垂直居中
  5. 产品经理如何看待NPDP认证?
  6. 苹果手机屏幕镜像搜索不到电视_用手机开热点投屏需要流量吗?
  7. addr2line方法使用总结
  8. 计算机语言异或符号,异或门的电路符号表达_XOR的电路实现
  9. qemu中vCPU对应的线程
  10. 批处理|测试工具|局域网速度测试/网络上传与下载速度测试