1. 概述
本文将介绍如何使用 Apache Commons IO 和 Java 8 原生的 Base64 支持,将图像文件编码为 Base64 字符串,并能从该字符串还原出原始图像。
✅ 这个方法不仅适用于图片,任何二进制文件(如 PDF、音频、视频)都可以用相同方式处理。
⚠️ 特别适用于需要通过 JSON 传输二进制数据的场景 —— 比如移动端上传图片到后端 REST 接口时,把图片转成 Base64 直接塞进 JSON body,简单粗暴但实用。
如果你对 Base64 编码原理还不熟,建议先阅读 Java Base64 编码与解码详解。
2. Maven 依赖
先引入 Apache Commons IO,用于简化文件读写操作:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
📌 最新版本可前往 Maven Central 查询。
✅ Java 8+ 已内置
java.util.Base64
,无需额外依赖 Base64 工具库。
3. 图片文件转 Base64 字符串
核心步骤就两步:
- 读取文件为字节数组
- 使用 Java 8 的
Base64.getEncoder()
编码为字符串
byte[] fileContent = FileUtils.readFileToByteArray(new File(filePath));
String encodedString = Base64.getEncoder().encodeToString(fileContent);
✅ encodedString
是一个由 A-Za-z0-9+/
字符组成的字符串,末尾可能带 =
补位。
❌ 解码器会严格校验字符集,非法字符直接抛异常。
💡 小贴士:Base64 编码后体积约膨胀 33%,传大文件要谨慎,容易踩坑 OOM 或接口超时。
4. Base64 字符串还原为图片文件
反过来也一样简单:
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
FileUtils.writeByteArrayToFile(new File(outputFileName), decodedBytes);
✅ 一行解码,一行写文件,干净利落。
⚠️ 注意输出路径权限和磁盘空间,尤其是生产环境批量处理时。
5. 完整测试示例
下面是一个完整的单元测试,验证整个流程的正确性:
public class FileToBase64StringConversionUnitTest {
private String inputFilePath = "test_image.jpg";
private String outputFilePath = "test_image_copy.jpg";
@Test
public void fileToBase64StringConversion() throws IOException {
// 加载 src/test/resources 下的测试图片
ClassLoader classLoader = getClass().getClassLoader();
File inputFile = new File(classLoader
.getResource(inputFilePath)
.getFile());
// 1. 读取原文件为字节数组
byte[] fileContent = FileUtils.readFileToByteArray(inputFile);
// 2. 编码为 Base64 字符串
String encodedString = Base64
.getEncoder()
.encodeToString(fileContent);
// 3. 构建输出文件路径
File outputFile = new File(inputFile
.getParentFile()
.getAbsolutePath() + File.separator + outputFilePath);
// 4. 解码并写入新文件
byte[] decodedBytes = Base64
.getDecoder()
.decode(encodedString);
FileUtils.writeByteArrayToFile(outputFile, decodedBytes);
// 5. 验证两个文件内容完全一致
assertTrue(FileUtils.contentEquals(inputFile, outputFile));
}
}
📌 关键点说明:
- 使用
FileUtils.contentEquals()
比较文件内容,避免因元数据差异误判 - 路径拼接用
File.separator
而非硬编码/
或\
,保证跨平台兼容性
6. 总结
本文简单直接地演示了如何:
- ✅ 使用 Java 8 原生 API 完成 Base64 编解码
- ✅ 借助 Commons IO 简化文件操作
- ✅ 实现图片与 Base64 字符串互转,并验证完整性
📌 适用场景:小文件传输、配置内嵌资源、前端 data URL 生成等。
🚫 不推荐用于大文件或高频调用场景,性能和内存开销需评估。
完整代码示例已上传至 GitHub:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-string-conversions