这几天项目刚好用到补丁下载,也就是说客户端上传一个文件,然后服务端拿到文件,把文件的内容转换成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(); } } |