1. 概述

本文将介绍如何使用 Apache Commons IOJava 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 字符串

核心步骤就两步:

  1. 读取文件为字节数组
  2. 使用 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


原始标题:Image to Base64 String Conversion