如何比較 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 行為與正式版相同。
核心實作:基於串流的文件比較
完整工作流程
- 初始化 – 將來源文件載入為串流。
- 比較 – 新增目標文件串流。
- 偵測 – 取得
ChangeInfo物件清單。 - 決策 – 以程式方式接受或拒絕變更。
- 產生 – 將最終合併文件寫入輸出串流。
步驟 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