如何比較 Java 文件 – 使用 GroupDocs API 的指南

當您需要 比較 Java 文件——無論是合約、技術規格還是 PDF 報告——手動執行既危險又耗時。本教學將示範如何使用 GroupDocs.Comparison API,並使用 Java 串流將記憶體使用維持在低水平,同時提升效能。您將看到完整的工作流程、學習如何接受或拒絕特定變更,並發掘大型部署的最佳實踐技巧。

快速解答

  • 哪個函式庫最適合比較 Java 文件? GroupDocs.Comparison (Java)
  • 我可以比較 DOCX、PDF 和 TXT 檔案嗎? 是 — API 支援超過 50 種格式。
  • 基於串流的比較是否節省記憶體? 絕對是;它會以區塊方式處理資料,而非一次載入整個檔案。
  • 如何接受或拒絕特定變更? 使用 ChangeInfo.setComparisonAction(...) 於回傳的變更上。
    ChangeInfo.setComparisonAction(...) 設定偵測到的變更的動作(接受或拒絕)。
  • 生產環境是否需要授權? 是 — 商業授權會移除浮水印並解鎖全部功能。

使用 GroupDocs 進行 Java 比較是什麼?

將兩個文件載入比較器,然後呼叫 getChanges() — API 會回傳詳細的差異清單,包括插入、刪除、格式微調以及影像變更,對於一般檔案只需幾毫秒。本說明提供核心概念:函式庫抽象化了 diff 演算法,您只需提供串流並處理回傳的 ChangeInfo 物件。
getChanges() 回傳描述每項差異的 ChangeInfo 物件清單。

GroupDocs.Comparison 是一套用於偵測文件差異的 Java 函式庫。它支援超過 50 種輸入與輸出格式,能在不將整個文件載入記憶體的情況下處理數百頁的檔案,並回傳結構化的變更清單,讓您以程式方式接受或拒絕。

為何在 Java 文件比較中使用 GroupDocs.Comparison?

您可以獲得精確的變更追蹤、跨格式支援,以及基於串流的處理,即使是 200 頁的 PDF 也能將 RAM 使用量控制在 100 MB 以下。此函式庫在標準 4 核心伺服器上能於 2 秒內處理 100 頁文件,適用於 CI 流程、文件管理系統以及需要即時差異結果的微服務。

前置條件

  • JDK 8+(建議 11+)
  • Maven 或 Gradle(範例使用 Maven)
  • 具備 Java 串流與例外處理的基本知識
  • 兩個任意支援格式(DOCX、PDF、TXT 等)的範例文件

專業提示: 若您剛接觸串流,程式碼片段內含行內註解說明每一步。

設定 GroupDocs.Comparison:基礎

Maven 設定

將儲存庫與相依性加入您的 pom.xml

<repositories>
   <repository>
      <id>repository.groupdocs.com</id>
      <name>GroupDocs Repository</name>
      <url>https://releases.groupdocs.com/comparison/java/</url>
   </repository>
</repositories>

<dependencies>
   <dependency>
      <groupId>com.groupdocs</groupId>
      <artifactId>groupdocs-comparison</artifactId>
      <version>25.2</version>
   </dependency>
</dependencies>

了解授權(商業層面)

GroupDocs 以商業模式營運,但授權相當彈性:

  • 免費試用 – 適合評估與小型專案。
  • 臨時授權 – 完美用於概念驗證工作(在此取得
  • 商業授權 – 生產環境必須使用(價格細節

試用版會在輸出文件上加上浮水印,但 API 行為與正式版相同。

核心實作:基於串流的文件比較

完整工作流程

  1. 初始化 – 將來源文件載入為串流。
  2. 比較 – 新增目標文件串流。
  3. 偵測 – 取得 ChangeInfo 物件清單。
  4. 決策 – 以程式方式接受或拒絕變更。
  5. 產生 – 將最終合併文件寫入輸出串流。

步驟 1:使用來源文件串流初始化比較器

try (InputStream sourceStream = new FileInputStream(sourceFilePath);
     InputStream targetStream = new FileInputStream(targetFilePath);
     OutputStream resultStream = new FileOutputStream(outputFilePath)) {

    Comparer comparer = new Comparer(sourceStream);

為何使用串流? 它們透過分塊處理資料,降低記憶體使用,而非一次載入整個檔案。

步驟 2:新增目標文件以進行比較

comparer.add(targetStream);

引擎現在已擁有兩個文件,並可開始進行差異比對。

步驟 3:偵測與分析變更

ChangeInfo[] changes = comparer.getChanges();

每個 ChangeInfo 代表一次插入、刪除、格式微調、影像變更等。

步驟 4:以程式方式接受或拒絕變更

changes[0].setComparisonAction(ComparisonAction.REJECT);

典型自動化模式:

  • 接受所有格式變更,拒絕內容編輯。
  • 自動拒絕頁首/頁尾的變更。
  • 僅接受可信作者的變更。

步驟 5:產生最終文件

comparer.applyChanges(resultStream, new ApplyChangeOptions(changes));

ApplyChangeOptions 讓您微調合併行為,例如保留原始樣式。

真實案例應用:此方案的優勢

  • 法律合約審查 – 自動標記修訂並將其分派給適當的審核者。
  • 學術論文修訂 – 接受小幅格式修正,同時標示實質編輯。
  • 軟體文件 – 偵測可能導致客戶端程式碼失效的 API 規格變更。
  • 法規遵循 – 為政策更新保留稽核追蹤。

常見陷阱與避免方法

記憶體管理問題

  • 問題: 大型 PDF 產生記憶體不足錯誤。
  • 解決方案: 一定使用 try‑with‑resources(如範例所示),並監控堆積大小(-Xmx4g 或更高)。
try (InputStream source = new FileInputStream(sourcePath)) {
    // comparison logic
}

格式相容性驚喜

  • 問題: 將 DOCX 與 PDF 比較可能遺漏細微的版面差異。
  • 解決方案: 對於關鍵法律文件,建議使用相同格式進行比較。

效能下降

  • 問題: 隨時間比較速度變慢。
  • 解決方案: 清理暫存檔、限制文件大小,並考慮以非同步方式處理批次作業。

變更偵測靈敏度

  • 問題: 出現過多瑣碎變更(空白、字型)。
  • 解決方案: 設定引擎忽略非必要差異:
CompareOptions options = new CompareOptions();
options.setIgnoreWhitespaces(true);
comparer.compare(outputStream, options);

CompareOptions 讓您設定比較器應偵測或忽略的變更類型。

效能優化:上線準備技巧

  • JVM 調校: 使用 G1GC 並設定適當的堆積大小(對於 >100 MB 文件使用 -Xmx8g)。
  • 非同步處理: 將比較工作交給工作佇列。
  • 快取: 為常比較的文件對儲存結果。
  • 擴充性: 將比較器部署為無狀態微服務,置於負載平衡器之後。

疑難排解指南

症狀診斷解決方案
OutOfMemoryError文件超出堆積大小增加堆積、使用分塊或預先處理以裁剪不必要的部分
缺少變更格式不相容或靈敏度過低確認格式,調整 CompareOptions
隨時間變慢資源泄漏確保所有串流已關閉,清除暫存目錄

替代方案(當 GroupDocs 不適合時)

  • Apache Tika + 自訂 diff – 免費但需更多程式碼。
  • 特定格式函式庫 – 適合單一格式的流程。
  • 雲端 API – 低維護成本,但會增加延遲與資料隱私顧慮。

常見問答

Q: GroupDocs.Comparison 支援哪些文件格式?
A: 超過 50 種格式,包括 DOCX、PDF、PPTX、XLSX、TXT、HTML 等。請參閱 格式文件說明

Q: 我可以一次比較超過兩個文件嗎?
A: 可以。在呼叫 getChanges() 之前,多次呼叫 comparer.add() 以合併多個版本。

Q: 如何處理受密碼保護的檔案?
A: 使用 LoadOptions 提供密碼:

LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
Comparer comparer = new Comparer(sourceStream, loadOptions);

LoadOptions 允許您在載入文件時指定密碼等選項。

Q: 有檔案大小限制嗎?
A: 沒有硬性限制,但記憶體使用會隨檔案大小增加。對於 >100 MB 的檔案,請增加堆積或將文件分割。

Q: 我可以自訂偵測哪些變更類型嗎?
A: 當然可以。CompareOptions 讓您忽略空白、格式,或聚焦特定段落。

Q: 這能在 Docker 容器中運行嗎?
A: 能 — 只需分配足夠的記憶體並掛載授權檔案。

其他資源


最後更新: 2026-08-30
測試版本: GroupDocs.Comparison 25.2 (Java)
作者: GroupDocs

相關教學