下面我将分步介绍如何使用,并提供完整的代码示例。

(图片来源网络,侵删)
Java 8+ (推荐方法)
从 Java 8 开始,标准库中引入了 java.util.Base64 类,这是目前最推荐、最标准的方式,它提供了三组不同的编解码器,以满足不同场景的需求。
核心类:java.util.Base64
Base64.getEncoder(): 获取一个用于进行基本 Base64 编码的编码器。Base64.getDecoder(): 获取一个用于进行基本 Base64 解码的解码器。Base64.getUrlEncoder()/Base64.getUrlDecoder(): 获取用于 URL 和文件名安全的编解码器,它会将 替换为 ,将 替换为_,去掉了填充字符 。Base64.getMimeEncoder()/Base64.getMimeDecoder(): 获取用于 MIME 消息的编解码器,它可以处理每行不超过 76 个字符,并可能包含换行符。
编码和解码示例
我们将使用最常见的基本 Base64 编码/解码进行演示。
步骤 1: 准备环境
确保你使用的是 Java 8 或更高版本。
步骤 2: 编码
编码是将字节数组转换为 Base64 字符串的过程。

(图片来源网络,侵删)
代码示例:
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class Base64EncoderExample {
public static void main(String[] args) {
// 1. 准备要编码的原始字符串
String originalString = "Hello, Base64! 这是一个测试。";
// 2. 将字符串转换为字节数组 (非常重要!)
// 通常使用 UTF-8 字符集,以避免在不同平台间产生不一致的结果。
byte[] originalBytes = originalString.getBytes(StandardCharsets.UTF_8);
// 3. 获取 Base64 编码器
Base64.Encoder encoder = Base64.getEncoder();
// 4. 执行编码
byte[] encodedBytes = encoder.encode(originalBytes);
// 5. 将编码后的字节数组转换为字符串
String encodedString = new String(encodedBytes);
// 另一种更简洁的链式调用方式
String encodedStringShort = Base64.getEncoder().encodeToString(originalBytes);
System.out.println("原始字符串: " + originalString);
System.out.println("原始字节数组: " + java.util.Arrays.toString(originalBytes));
System.out.println("编码后的字符串: " + encodedString);
System.out.println("编码后的字符串 (简洁版): " + encodedStringShort);
}
}
输出:
原始字符串: Hello, Base64! 这是一个测试。
原始字节数组: [72, 101, 108, 108, 111, 44, 32, 66, 97, 115, 101, 54, 52, 33, 32, 228, 189, 160, 229, 155, 149, 32, 231, 148, 153, 229, 173, 151, 46]
编码后的字符串: SGVsbG8sIEJhc2U2NCEg5pys5paH5Liq5LqO5a2X5Lmg5LiA77yB5LiN5ZCM
编码后的字符串 (简洁版): SGVsbG8sIEJhc2U2NCIg5pys5paH5Liq5LqO5a2X5Lmg5LiA77yB5LiN5ZCM
步骤 3: 解码
解码是将 Base64 字符串转换回原始字节数组,然后再还原为字符串的过程。
代码示例:

(图片来源网络,侵删)
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class Base64DecoderExample {
public static void main(String[] args) {
// 1. 准备要解码的 Base64 字符串
String encodedString = "SGVsbG8sIEJhc2U2NCIg5pys5paH5Liq5LqO5a2X5Lmg5LiA77yB5LiN5ZCM";
// 2. 获取 Base64 解码器
Base64.Decoder decoder = Base64.getDecoder();
try {
// 3. 执行解码,将 Base64 字符串转换为字节数组
byte[] decodedBytes = decoder.decode(encodedString);
// 4. 将解码后的字节数组转换回字符串
String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("待解码的字符串: " + encodedString);
System.out.println("解码后的字节数组: " + java.util.Arrays.toString(decodedBytes));
System.out.println("解码后的字符串: " + decodedString);
} catch (IllegalArgumentException e) {
System.err.println("错误:输入的字符串不是有效的 Base64 格式!");
e.printStackTrace();
}
}
}
输出:
待解码的字符串: SGVsbG8sIEJhc2U2NCIg5pys5paH5Liq5LqO5a2X5Lmg5LiA77yB5LiN5ZCM
解码后的字节数组: [72, 101, 108, 108, 111, 44, 32, 66, 97, 115, 101, 54, 52, 33, 32, 228, 189, 160, 229, 155, 149, 32, 231, 148, 153, 229, 173, 151, 46]
解码后的字符串: Hello, Base64! 这是一个测试。
完整的编码与解码工具类示例
下面是一个实用的工具类,封装了编码和解码方法,方便在项目中复用。
import java.nio.charset.StandardCharsets;
import java.util.Base64;
/**
* Base64 编码和解码工具类
*/
public class Base64Utils {
/**
* 将字符串进行 Base64 编码
* @param str 原始字符串
* @return Base64 编码后的字符串
*/
public static String encode(String str) {
if (str == null) {
return null;
}
byte[] encodedBytes = Base64.getEncoder().encode(str.getBytes(StandardCharsets.UTF_8));
return new String(encodedBytes);
}
/**
* 将 Base64 编码的字符串解码
* @param encodedStr Base64 编码的字符串
* @return 解码后的原始字符串
* @throws IllegalArgumentException 如果输入不是有效的 Base64 字符串
*/
public static String decode(String encodedStr) {
if (encodedStr == null) {
return null;
}
byte[] decodedBytes = Base64.getDecoder().decode(encodedStr);
return new String(decodedBytes, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
String originalText = "Java 8 的 Base64 API 非常好用!";
System.out.println("--- 编码 ---");
String encodedText = Base64Utils.encode(originalText);
System.out.println("原始文本: " + originalText);
System.out.println("编码后: " + encodedText);
System.out.println("\n--- 解码 ---");
String decodedText = Base64Utils.decode(encodedText);
System.out.println("待解码: " + encodedText);
System.out.println("解码后: " + decodedText);
// 验证解码后的文本是否与原始文本一致
System.out.println("\n验证: " + originalText.equals(decodedText)); // 应该输出 true
}
}
不同类型编解码器的区别
| 类型 | 获取方式 | 特点 | 适用场景 |
|---|---|---|---|
| 基本 | Base64.getEncoder() |
标准 Base64 编码,使用 和 作为最后两个字符,末尾可能用 填充。 | 大多数通用场景,如编码二进制文件、密钥等。 |
| URL 安全 | Base64.getUrlEncoder() |
将 替换为 ,将 替换为 _,去掉了填充字符 。 |
URL、文件名或需要避免使用特殊字符的标识符。 |
| MIME | Base64.getMimeEncoder() |
按每行 76 个字符进行分割,并可能在末尾添加换行符 \r\n。 |
编码 MIME 消息(如电子邮件附件),使其符合邮件协议规范。 |
URL 安全示例:
String originalString = "Hello+World/Java";
byte[] urlEncodedBytes = Base64.getUrlEncoder().encode(originalString.getBytes(StandardCharsets.UTF_8));
String urlEncodedString = new String(urlEncodedBytes);
System.out.println("URL 编码: " + urlEncodedString); // 输出: SGVsbG9Xb3JsZC9KYXZh
- 首选
java.util.Base64:对于任何 Java 8+ 项目,都应使用内置的java.util.Base64类。 - 注意字符集:始终在
String和byte[]之间转换时指定字符集(如StandardCharsets.UTF_8),以保证跨平台兼容性。 - 选择正确的编解码器:根据你的使用场景(通用、URL、MIME)选择合适的
getEncoder()/getDecoder()变体。 - 处理异常:解码时,输入的字符串格式不正确会抛出
IllegalArgumentException,需要进行捕获和处理。
