第七章

Java 中的 Base64

从 Java 8 开始,官方终于提供了标准工具类

7.1 历史背景

在 Java 8 之前,开发者通常使用第三方库(如 Apache Commons Codec)或内部私有类(如 sun.misc.BASE64Encoder,不推荐)。Java 8 引入了标准的 java.util.Base64 类,彻底解决了这个问题。

7.2 标准编码器(Basic)

用于处理常规的标准 Base64 格式。

import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) {
        String originalInput = "Hello, World!";
        
        // 编码
        String encoded = Base64.getEncoder()
            .encodeToString(originalInput.getBytes(StandardCharsets.UTF_8));
        System.out.println(encoded); 
        // 输出: SGVsbG8sIFdvcmxkIQ==

        // 解码
        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
        System.out.println(decodedString);
        // 输出: Hello, World!
    }
}

7.3 URL 安全编码器

+/ 替换为 -_,适用于 URL 参数。

String url = "https://example.com?a=b";

// 编码
String encodedUrl = Base64.getUrlEncoder()
    .encodeToString(url.getBytes(StandardCharsets.UTF_8));

// 解码
byte[] decodedUrl = Base64.getUrlDecoder().decode(encodedUrl);

7.4 MIME 编码器

主要用于电子邮件(MIME)。它会每隔 76 个字符插入一个换行符(\r\n),以符合邮件协议的行长限制。

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; ++i) {
    sb.append(UUID.randomUUID().toString());
}

// 编码结果包含换行
byte[] initBytes = sb.toString().getBytes(StandardCharsets.UTF_8);
String mimeEncoded = Base64.getMimeEncoder().encodeToString(initBytes);