Base64 并不是一种加密算法,而是一种编码方式,它的主要目的是将二进制数据(如图片、文件等)转换为一串由 64 个可打印字符(A-Z, a-z, 0-9, +, /)组成的文本字符串,这使得二进制数据可以在只支持文本的协议(如 HTTP、SMTP)中安全地传输。

Java 8 及更高版本 (推荐)
从 Java 8 开始,Java 标准库中正式引入了 java.util.Base64 类,这是官方推荐、也是最简单、最高效的方式。
核心类
java.util.Base64: 提供了静态方法来获取编码器和解码器。java.util.Base64.Encoder: 负责将字节数组或字符串编码为 Base64 字符串。java.util.Base64.Decoder: 负责将 Base64 字符串解码为原始的字节数组。
示例:字符串的编码与解码
这是最常见的使用场景,需要注意的是,Java 的 Base64 编码器直接操作的是字节数组,而不是字符串,你需要先将字符串转换为字节数组(通常使用 UTF-8 编码),解码后再将字节数组转换回字符串。
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class Java8Base64Example {
public static void main(String[] args) {
// 原始字符串
String originalString = "Hello, Base64 in Java 8!";
// --- 1. 编码 ---
// 获取 Base64 编码器
Base64.Encoder encoder = Base64.getEncoder();
// 将字符串转换为字节数组 (使用 UTF-8 编码)
byte[] bytesToEncode = originalString.getBytes(StandardCharsets.UTF_8);
// 进行编码
byte[] encodedBytes = encoder.encode(bytesToEncode);
// 将编码后的字节数组转换为字符串
String encodedString = new String(encodedBytes, StandardCharsets.UTF_8);
System.out.println("原始字符串: " + originalString);
System.out.println("编码后字符串: " + encodedString);
System.out.println("---------------------------------");
// --- 2. 解码 ---
// 获取 Base64 解码器
Base64.Decoder decoder = Base64.getDecoder();
// 将 Base64 字符串转换回字节数组
byte[] bytesToDecode = encodedString.getBytes(StandardCharsets.UTF_8);
// 进行解码
byte[] decodedBytes = decoder.decode(bytesToDecode);
// 将解码后的字节数组转换回字符串
String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("待解码字符串: " + encodedString);
System.out.println("解码后字符串: " + decodedString);
// 验证
System.out.println("解码是否成功: " + originalString.equals(decodedString));
}
}
输出结果:
原始字符串: Hello, Base64 in Java 8!
编码后字符串: SGVsbG8sIEJhc2U2NCBpbiBKYXZhIDgh
---------------------------------
待解码字符串: SGVsbG8sIEJhc2U2NCBpbiBKYXZhIDgh
解码后字符串: Hello, Base64 in Java 8!
解码是否成功: true
示例:字节数组的直接编码与解码
你处理的是二进制数据(如图片、文件),而不是字符串,这时可以直接操作字节数组。

import java.util.Base64;
public class Base64BytesExample {
public static void main(String[] args) {
// 原始字节数组
byte[] originalBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// --- 编码 ---
Base64.Encoder encoder = Base64.getEncoder();
byte[] encodedBytes = encoder.encode(originalBytes);
System.out.println("原始字节数组: " + bytesToHex(originalBytes));
System.out.println("编码后字节数组: " + new String(encodedBytes)); // Base64 字符串
System.out.println("---------------------------------");
// --- 解码 ---
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(encodedBytes);
System.out.println("解码后字节数组: " + bytesToHex(decodedBytes));
// 验证
boolean isSame = true;
for (int i = 0; i < originalBytes.length; i++) {
if (originalBytes[i] != decodedBytes[i]) {
isSame = false;
break;
}
}
System.out.println("解码是否成功: " + isSame);
}
// 一个辅助方法,用于将字节数组转换为十六进制字符串,方便打印
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X ", b));
}
return sb.toString();
}
}
输出结果:
原始字节数组: 01 02 03 04 05 06 07 08 09 0A
编码后字节数组: AQIDBAUGBwgJAA==
---------------------------------
解码后字节数组: 01 02 03 04 05 06 07 08 09 0A
解码是否成功: true
示例:URL 安全编码
标准的 Base64 编码中包含 和 这两个字符,在 URL 中, 会被解释为空格, 是路径分隔符,这可能会导致问题。java.util.Base64 提供了一个 URL 安全的编码器。
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class Base64UrlExample {
public static void main(String[] args) {
String originalString = "Hello, Base64 URL Safe!";
// 获取 URL 安全的编码器
Base64.Encoder urlEncoder = Base64.getUrlEncoder();
byte[] urlEncodedBytes = urlEncoder.encode(originalString.getBytes(StandardCharsets.UTF_8));
String urlEncodedString = new String(urlEncodedBytes, StandardCharsets.UTF_8);
System.out.println("原始字符串: " + originalString);
System.out.println("URL 安全编码后字符串: " + urlEncodedString);
// 获取 URL 安全的解码器
Base64.Decoder urlDecoder = Base64.getUrlDecoder();
byte[] urlDecodedBytes = urlDecoder.decode(urlEncodedBytes);
String urlDecodedString = new String(urlDecodedBytes, StandardCharsets.UTF_8);
System.out.println("URL 安全解码后字符串: " + urlDecodedString);
}
}
输出结果:
原始字符串: Hello, Base64 URL Safe!
URL 安全编码后字符串: SGVsbG8sIEJhc2U2NCBVUkwgU2FmZSE=
URL 安全解码后字符串: Hello, Base64 URL Safe!
注意:URL 安全编码会使用 替代 ,使用 _ 替代 。

Java 8 之前版本
如果你在使用 Java 7 或更早的版本,你需要使用第三方库,最常用的是 Apache Commons Codec。
添加依赖
你需要在你的项目中添加 commons-codec 库的依赖。
Maven (pom.xml):
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version> <!-- 使用最新版本 -->
</dependency>
Gradle (build.gradle):
implementation 'commons-codec:commons-codec:1.15' // 使用最新版本
使用示例
API 非常简洁,org.apache.commons.codec.binary.Base64 类提供了静态方法。
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
public CommonsCodecExample {
public static void main(String[] args) {
String originalString = "Hello, Base64 with Commons Codec!";
// --- 1. 编码 ---
// 使用 StringUtils 简化字符串和字节数组的转换
byte[] encodedBytes = Base64.encodeBase64(originalString.getBytes(StandardCharsets.UTF_8));
String encodedString = StringUtils.newStringUtf8(encodedBytes);
System.out.println("原始字符串: " + originalString);
System.out.println("编码后字符串: " + encodedString);
System.out.println("---------------------------------");
// --- 2. 解码 ---
byte[] decodedBytes = Base64.decodeBase64(encodedString);
String decodedString = StringUtils.newStringUtf8(decodedBytes);
System.out.println("待解码字符串: " + encodedString);
System.out.println("解码后字符串: " + decodedString);
// 验证
System.out.println("解码是否成功: " + originalString.equals(decodedString));
}
}
总结与对比
| 特性 | Java 8+ (java.util.Base64) |
Java 8- (Apache Commons Codec) |
|---|---|---|
| 官方性 | 官方标准库,无需额外依赖 | 第三方库,需要添加依赖 |
| 推荐度 | 强烈推荐,是现代 Java 开发的标准 | 旧项目或无法升级 Java 版本时使用 |
| API 风格 | Encoder / Decoder 对象,方法链式调用 |
鰾 Base64.encodeBase64() 等静态方法,非常直接 |
| 功能 | 提供标准、URL 安全、MIME 等多种编码器 | 功能强大,同样支持标准、URL 安全等 |
| 性能 | 通常性能更好,因为是 JVM 内部实现 | 性能也很好,是业界广泛验证的库 |
- 如果你使用的是 Java 8 或更高版本,请毫不犹豫地使用
java.util.Base64。 - 如果你维护的是一个旧项目,并且无法升级 Java 版本,Apache Commons Codec 是一个非常可靠和成熟的选择。
