java 文件比对(四)-- 使用 diffutils
一 需求实现比对两个文件,第四种方法,使用 diffutils 库。二 实例2.1 准备创建 maven 项目导入 diffutils 库到 pom.xml 文件中<dependency><groupId>com.googlecode.java-diff-utils</groupId><artifactId>diffutils</artifac
·
一 需求
实现比对两个文件,第四种方法,使用 diffutils 库。
二 实例
2.1 准备
- 创建 maven 项目
- 导入 diffutils 库到 pom.xml 文件中
<dependency>
<groupId>com.googlecode.java-diff-utils</groupId>
<artifactId>diffutils</artifactId>
<version>1.2.1</version>
</dependency>
- 准备 different.html 放在项目根路径下,文件内容参考: https://blog.csdn.net/fengyang182/article/details/109508007 中该文件
- 准备两个需要待比对的文件,我准备的是两个 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 文档需要记录节点路径),简单易用,推荐使用该方法。当然同样的也可以对该库的方法进行扩展,该实例只简单展示了基本用法。
更多推荐
所有评论(0)