java-diff


兩個文件如何比較差異?可能會想到有文件比對工具,比如Beyond Compare
Java如何做呢?,今天介紹一下java-diff-utils

java-diff-utils 是基於java的一種diff實現
github地址: https://github.com/java-diff-utils/java-diff-utils

github 上有一些案例,此處不再贅述.此處只寫一種比對兩個文件的差異

jar依賴

<dependency>
  <groupId>io.github.java-diff-utils</groupId>
  <artifactId>java-diff-utils</artifactId>
  <version>4.5</version>
</dependency>

 

 

package com.XXXX;

import com.github.difflib.DiffUtils;
import com.github.difflib.algorithm.DiffException;
import com.github.difflib.patch.AbstractDelta;
import com.github.difflib.patch.Chunk;
import com.github.difflib.patch.Patch;
import org.apache.commons.io.IOUtils;

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

class ModuleEventWatcher {
     public static void main(String[] args) throws IOException, DiffException {
         File src = new File("D:/MS/log1.log");
         File target = new File("D:/MS/log2.log");
         List<String> original = IOUtils.readLines(new FileInputStream(src), "UTF-8");
         List<String> revised = IOUtils.readLines(new FileInputStream(target), "UTF-8");
         Patch<String> diff = DiffUtils.diff(original, revised);
         List<AbstractDelta<String>> deltas = diff.getDeltas();
         deltas.forEach(delta -> {
             switch (delta.getType()) {
                 case INSERT:
                     //新增
                     Chunk<String> insert = delta.getTarget();
                     int position = insert.getPosition();
                     System.out.println("+ " + (position + 1) + " " + insert.getLines());
                     break;
                 case CHANGE:
                     //修改
                     Chunk<String> source = delta.getSource();
                     Chunk<String> target1 = delta.getTarget();
                     System.out.println("\n- " + (source.getPosition() + 1) + " " + source.getLines() + "\n+ " + "" + (target1.getPosition() + 1) + " " + target1.getLines());
                     break;
                 case DELETE:
                     //刪除
                     Chunk<String> delete = delta.getSource();
                     System.out.println("- " + (delete.getPosition() + 1) + " " + delete.getLines());
                     break;
                 case EQUAL:
//                    System.out.println("無變化");
                     break;
             }
         });
     }
}

運行結果

 

 

  • 說明
    DeltaType 共計有四種類型,分別是EQUAL,DELETE,INSERT,CHANGE.含義也很好理解分別為相同,刪除,新增,修改

delta.getSource()可以獲取源文件的相關信息,delta.getTarget()可以獲取目標文件的相關相關信息,返回值均為Chunk<String>,新增時delta.getSource()的信息為空(非null),刪除時delta.getTarget()的信息為空(非null)

chunk.getPosition()+1則為行號,chunk.getLines()為對比的文字內容,





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM