java diff_match_patch使用笔记

本文介绍了一个文件差异对比的实现案例,利用diff_match_patch工具库来找出两个文件的不同之处,并通过对比后的结果进行文件的重新拼接。该方法适用于需要进行文件版本比较的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天项目刚好用到补丁下载,也就是说客户端上传一个文件,然后服务端拿到文件,把文件的内容转换成String,通过服务器上文件版本信息,进行对比,找出2个文件不同的地方,然后进行文件的重新拼接,为此做个笔记,方便后期自己使用!

需求:上传文件跟服务器上文件进行对比,返回2个文件不同的String文件信息(当然这个有第三方)

diff_match_patch工具文件资源:链接:https://pan.baidu.com/s/1iKKxAdsbbUwkRtzaYGOz4A 密码:yzf4

git地址:  https://github.com/JanX2/google-diff-match-patch-git-svn 

测试代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;


import com.web.util.diff_match_patch.Diff;


/**
 * @ClassName:Test
 * @Description:
 * @Date: 2018年6月28日 下午4:40:17
 * @author zlf
 * @version V1.0
 */
public class Test {
public static void main(String[] arge) throws Exception {
diff_match_patch dmp = new diff_match_patch();
try {
// 字符串1 altbe 字符串2 altaf
String file1 = readFileContent("C:\\Users\\admin\\Desktop\\index.android.bundle");
String file2 = readFileContent("D:\\maven\\tools\\index.android.bundle");
List<Integer> beList = rememberSpacing(file1);
List<Integer> afList = rememberSpacing(file2);
file1 = file1.replace(" ", "");
file2 = file2.replace(" ", "");
LinkedList<Diff> t = dmp.diff_main(file1, file2,true);
//拼接测试
/*for (Diff diff : t) {
System.out.println(diff.toString());
}
LinkedList<Patch> patches = dmp.patch_make(t);
String patchesStr = dmp.patch_toText(patches);
patches = (LinkedList<Patch>) dmp.patch_fromText(patchesStr);
Object[] results = dmp.patch_apply(patches, file1);
System.out.println("组装后的新文件 : " + results[0]);*/
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
Integer indexBe = 0;
Integer indexAf = 0;
for (Diff diff : t) {
StringBuffer diffTextBe = new StringBuffer(diff.text);//比对之前
StringBuffer diffTextAf = new StringBuffer(diff.text);//比对之后
if (diff.operation.toString().equalsIgnoreCase("DELETE") || diff.operation.toString().equalsIgnoreCase("INSERT")) {//如果比对结果是EQUAL[保持不变]
indexBe = appendString2("DELETE", diff, s1, s2, beList, indexBe);
indexAf = appendString2("INSERT", diff, s2, s1, afList, indexAf);
s1.append(diffTextBe);
s2.append(diffTextAf);
indexBe += diffTextBe.length();
indexAf += diffTextAf.length();
}/*else{
addSpacing2(afList, indexAf, diffTextAf);
indexBe = appendString2("DELETE", diff, s1, s2, beList, indexBe);
indexAf = appendString2("INSERT", diff, s2, s1, afList, indexAf);
}*/

}
System.out.println(s1.toString());
//System.out.println(s2.toString());
} catch (Exception e) {
e.printStackTrace();
}

}


public static void appendString(String type, Diff diff, StringBuffer sbOne, StringBuffer sbTwo) {
if (type.equals(diff.operation.toString())) {
if (" ".equals(diff.text)) {
sbOne.append(" ");
sbTwo.append(" ");
} else {
sbOne.append(" ").append(diff.text).append("</em>");
}
}
}


public static List<Integer> rememberSpacing(String str) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < str.length(); i++) {
if (' ' == str.charAt(i)) {
list.add(i);
}
}
return list;
}


/*public static void addSpacing(List<Integer> list, Integer index, StringBuffer str) {
for (Integer o : list) {
if (o >= index && o < index + str.length()) {
str.insert(o - index, ' ');
}
}
}*/


public static Integer appendString2(String type, Diff diff, StringBuffer sbOne, StringBuffer sbTwo,
List<Integer> list, Integer i) {
Integer result = i;
if (type.equals(diff.operation.toString())) {
StringBuffer sb = new StringBuffer(diff.text);
for (Integer o : list) {
if (o >= i && o < i + sb.length()) {
sb.insert(o - i, ' ');
}
}
//sbOne.append("<em class='f-required'>").append(sb).append("</em>");
result = i + sb.length();
}
return result;
}

public static String readFileContent(String fileName) throws IOException {


File file = new File(fileName);


BufferedReader bf = new BufferedReader(new FileReader(file));


String content = "";
StringBuilder sb = new StringBuilder();


while (content != null) {
content = bf.readLine();


if (content == null) {
break;
}


sb.append(content.trim());
}


bf.close();
return sb.toString();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值