Base64 是二進制數據轉文本的標準編碼,廣泛用於 HTTP 傳輸、JSON 嵌入圖片、Token 編碼等場景。本文對比 JDK 8+ 內置 API、Apache Commons Codec、舊版 sun.misc 內部類與手寫實現,給出生產級選型建議。
| 方案 | 優點 | 缺點 | 推薦指數 |
|---|---|---|---|
| JDK 8+ java.util.Base64 | 標準庫、無依賴、支援 URL/MIME 變體、效能優化 | 需 JDK 8+ | ⭐⭐⭐⭐⭐ |
| Apache Commons Codec | API 穩定、舊版本 JDK 相容、功能豐富 | 需額外依賴 | ⭐⭐⭐⭐ |
| sun.misc.BASE64Encoder | JDK 早期內部實現 | 非公共 API,隨時可能移除/變更 | ⭐ (禁用) |
| 手寫實現 | 教學理解原理 | 易出錯、效能差、無緩衝區管理 | ⭐ (僅學習) |
import java.util.Base64;
String original = "Hello, Base64!";
// 標準編碼
String encoded = Base64.getEncoder().encodeToString(original.getBytes(StandardCharsets.UTF_8));
// 解碼
String decoded = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);
System.out.println("編碼: " + encoded); // SGVsbG8sIEJhc2U2NCE=
System.out.println("解碼: " + decoded); // Hello, Base64!
// URL 安全編碼:+ → -, / → _, 去除填充 =
String urlSafe = Base64.getUrlEncoder().encodeToString(data);
// 對應解碼器自動處理
String decoded = new String(Base64.getUrlDecoder().decode(urlSafe), StandardCharsets.UTF_8);
String mime = Base64.getMimeEncoder().encodeToString(largeData);
try (InputStream in = new FileInputStream("big.bin");
OutputStream out = new FileOutputStream("big.b64");
OutputStream encoder = Base64.getEncoder().wrap(out)) {
in.transferTo(encoder); // JDK 9+ 零拷貝
}
commons-codec
commons-codec
1.16.0
import org.apache.commons.codec.binary.Base64;
byte[] encoded = Base64.encodeBase64(data);
byte[] decoded = Base64.decodeBase64(encoded);
// URL 安全
String urlSafe = Base64.encodeBase64URLSafeString(data);
原代碼(高風險):
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
String encoded = new BASE64Encoder().encode(bytes);
byte[] decoded = new BASE64Decoder().decodeBuffer(encoded);
遷移步驟:
java.util.Base64Base64.getEncoder().encodeToString(bytes)Base64.getDecoder().decode(string)StandardCharsets.UTF_8| 實現 | 編碼吞吐 | 解碼吞吐 |
|---|---|---|
| JDK Base64 | ~450 MB/s | ~500 MB/s |
| Commons Codec | ~400 MB/s | ~450 MB/s |
| sun.misc | ~300 MB/s | ~350 MB/s |
JDK 內置實現使用查表法 + 位運算優化,並針對現代 CPU 指令集(AVX2/SSE)向量化,效能最優。
StandardCharsets.UTF_8wrap() 處理