Base64.getEncoder()需配合原始字节数组使用,必须用Files.readAllBytes()或FileInputStream读取图片二进制数据,不可用ImageIO.read();编码后根据使用场景选择getEncoder()或getUrlEncoder(),并添加MIME前缀用于HTML内联。
Base64.getEncoder() 本身不能直接编码图片文件,它只处理字节数组;必须先读取图片为,再传入编码器——跳过这一步会抛或空字符串。
如何正确读取图片为 byte[] 并编码
Java 中图片编码的前提是拿到原始二进制数据,不是通过
(那得到的是
,已解码),而是用
或
。
最简洁,但要求文件存在且不超内存限制(一般图片没问题)
大图建议用
+
流式读取,避免 OOM
路径含中文或空格时,务必用
,别拼接字符串后直接传给
编码前可加判空:
编码后字符串的常见问题与处理
Base64 编码结果默认不含换行、无前缀,但前端(如 HTML
)需要带 MIME 前缀;后端接收时若用 URL 参数传递,需注意
和
在 URL 中被转义(应改用
)。
用于 HTML 内联:拼接
,其中
可从文件扩展名或
获取
用于 HTTP 请求体(如 JSON):直接使用
即可,无需额外处理
若传输走 GET 参数或 cookie:必须用
,否则
被当成空格、
被误解析
编码结果末尾的
是填充符,不可截断,否则解码失败
为什么不用 Apache Commons Codec 或
java
x.xml.bind.DatatypeConverter
是 Java 8+ 原生方案,无额外依赖、线程安全、性能好;而
在 Java 9+ 已弃用且移除,强依赖 JAXB 模块;Commons Codec 虽稳定,但引入 JAR 仅为了 Base64 属于过度设计。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
确认 JDK 版本 ≥ 8:运行
多线程环境直接复用
,它返回的是无状态单例,无需缓存
如果项目还在用 Java 7,别硬套 —— 改用
的
真正容易出错的地方不在编码逻辑本身,而在图片源的获取方式和传输通道对 Base64 字符的容忍度。比如把编码结果塞进 URL 却忘了用
,或者用
后试图编码 BufferedImage 对象——那得到的永远是乱码或空指针。
byte[]NullPointerExceptionImageIO.read()BufferedImageFiles.readAllBytes()FileInputStreamFiles.readAllBytes(Paths.get("avatar.png"))FileInputStreamByteArrayOutputStreamPaths.get(...)Fileif (bytes == null || bytes.length == 0) throw new IllegalArgumentException("Empty image data");+/Base64.getUrlEncoder()"data:image/" + format + ";base64," + encodedStringformatFiles.probeContentType()Base64.getEncoder().encodeToString(bytes)Base64.getUrlEncoder()+/=Base64.getEncoder()DatatypeConverter.printBase64Binary()System.getProperty("java.version")Base64.getEncoder()commons-codec:1.15Base64.encodeBase64String(bytes)getUrlEncoder()ImageIO.read()