base64在java中用于将二进制数据编码为ascii文本以适配纯文本协议,java 8+推荐使用线程安全的java.util.base64;需显式指定字符集避免乱码,它不加密、不压缩,仅格式转换,体积膨胀约33%。
Base64 在 Java 中解决的是二进制数据「文本化」传输问题
网络协议(如 HTTP、SMTP)、配置文件、URL 参数、JSON 字段等场景只支持 ASCII 文本,无法直接携带 byte[]。Base64 把任意字节序列编码成 A–Z、a–z、0–9、+、/ 和 =(填充符)组成的纯文本,确保安全透传,解码后能 1:1 恢复原始字节。它不加密、不压缩,只是编码格式转换。
Java 8+ 的 java.util.Base64 是标准且线程安全的首选
早年用 sun.misc.BASE64Encoder 或 Apache Commons Codec,但前者是内部 API(JDK 9+ 已移除),后者需额外依赖。java.util.Base64 是官方维护、无外部依赖、所有方法都是静态且线程安全的。
-
Base64.getEncoder()返回标准 Base64 编码器(含换行,适合文件) -
Base64.getUrlEncoder()使用-和_替代+//,无填充,适合 URL/文件名 -
Base64.getDecoder()对应解码;若用错编码器(如用标准解码器解 URL 编码字符串),会抛IllegalArgumentException: Illegal base64 character
示例:
String encoded = Base64.getUrlEncoder().encodeToString("hello 世界".getBytes(StandardCharsets.UTF_8)); // aGVsbG8g5L2g5aW9
常见踩坑:字符集不一致导致解码乱码
Base64 编解码操作的是字节,不是字符串。如果编码时用 str.getBytes()(依赖平台默认字符集),解码后用不同字符集 new String(…),必然乱码。