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(...),必然乱码。
立即学习“Java免费学习笔记(深入)”;
- 编码前必须显式指定字符集:例如
"中文".getBytes(StandardCharsets.UTF_8) - 解码后也必须用相同字符集构造字符串:例如
new String(decodedBytes, StandardCharsets.UTF_8) - 绕过字符串、直接处理
byte[](如加解密、图片读写)可彻底规避该问题
Base64 不等于加密,也不解决语义安全问题
它只是可逆的编码,任何拿到 Base64 字符串的人都能免费解码——浏览器控制台敲 atob("SGVsbG8=") 就得 "Hello"。真正需要保密的数据必须先加密(如 AES),再 Base64 编码;签名验签、权限校验等逻辑不能靠 Base64 隐藏。
另外,Base64 会使体积膨胀约 33%,大文件(如视频)直接 Base64 内嵌到 JSON 或 HTML 里会导致内存飙升和传输延迟,这种场景应改用二进制流或分块上传。









