Java 8+ 推荐使用 java.util.Base64,提供标准、URL 安全和 MIME 三种编码器;编码用 encodeToString(byte[]),解码用 decode(String),需注意字符集、填充符匹配及非法字符清理。

Java 8+ 自带 Base64 类怎么用
Java 8 开始,java.util.Base64 是官方推荐的唯一标准实现,无需引入第三方库。它提供三种编码器:标准(RFC 4648)、URL 安全(RFC 4648 §5)、MIME(RFC 2045),对应 getEncoder()、getUrlEncoder()、getMimeEncoder()。
最常用的是标准编码器,直接调用 Base64.getEncoder().encodeToString(byte[]) 即可完成字节数组到字符串的编码;解码用 Base64.getDecoder().decode(String),返回 byte[]。
注意:encodeToString() 输入必须是原始字节数组,不是字符串对象本身——如果传入的是文本(如 "hello"),得先用明确字符集转成字节,比如 "hello".getBytes(StandardCharsets.UTF_8),否则默认平台编码可能出错。
Base64.Decoder.decode() 报 IllegalArgumentException: Illegal base64 character
这个错误几乎都源于输入字符串含非法字符或长度不对(Base64 字符串长度必须是 4 的倍数,末尾用 = 填充)。常见诱因:
立即学习“Java免费学习笔记(深入)”;
- 字符串被 URL 或 JSON 二次转义,比如
%3D替代了=,或\\n换行符混入其中 - 前端传来的 Base64 数据带
data:image/png;base64,前缀,没截掉就直接解码 - 用了
getUrlEncoder()编码,却用标准getDecoder()解码(URL 编码把+//换成-/_,两者不兼容)
修复方式:先清理字符串——用正则去掉空格换行,截掉 base64, 前缀,再确认编码/解码器配对使用。例如 URL 场景统一走 getUrlEncoder() 和 getUrlDecoder()。
编码后字符串末尾的 = 能不能省?
可以省,但仅限于 URL 安全编码器(getUrlEncoder().withoutPadding())。标准和 MIME 编码器默认带填充,且 getDecoder() 要求严格匹配:如果编码时没填 =,解码会失败;反之,编码带 = 但解码器设为 withoutPadding() 也会报错。
实际建议:
- 内部系统通信:用默认带填充的标准编码,兼容性最好
- URL 或文件名场景:显式调用
getUrlEncoder().withoutPadding(),并配套用getUrlDecoder() - 别手动删
=——容易漏判、引发解码失败
性能与线程安全要注意什么
Base64.getEncoder() 和 getDecoder() 每次调用都返回新实例,但这些实例本身是无状态且线程安全的,可复用。不过没必要缓存静态单例——JVM 内联和对象分配开销极小,过度缓存反而增加维护负担。
真正影响性能的是大数组编码:避免对超长字符串反复调用 encodeToString(),改用流式接口 encoder.encode(InputStream) 或 encoder.wrap(OutputStream) 处理大文件;小数据(几 KB 内)直接用字符串方法更简洁。
另外,decode() 返回的是新分配的 byte[],如果后续要构造 String,记得指定字符集,例如 new String(decodedBytes, StandardCharsets.UTF_8),别依赖平台默认编码。










