杰瑞科技汇

Java Base64编码解码如何正确使用?

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

Java Base64编码解码如何正确使用?-图1
(图片来源网络,侵删)

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 字符串的过程。

Java Base64编码解码如何正确使用?-图2
(图片来源网络,侵删)

代码示例:

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 字符串转换回原始字节数组,然后再还原为字符串的过程。

代码示例:

Java Base64编码解码如何正确使用?-图3
(图片来源网络,侵删)
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 类。
  • 注意字符集:始终在 Stringbyte[] 之间转换时指定字符集(如 StandardCharsets.UTF_8),以保证跨平台兼容性。
  • 选择正确的编解码器:根据你的使用场景(通用、URL、MIME)选择合适的 getEncoder()/getDecoder() 变体。
  • 处理异常:解码时,输入的字符串格式不正确会抛出 IllegalArgumentException,需要进行捕获和处理。
分享:
扫描分享到社交APP
上一篇
下一篇