1. 概述

Base64 是一种文本编码方案,它在不同应用和平台之间提供了二进制数据的可移植性。Base64 可用于将二进制数据存储在数据库字符串列中,从而避免复杂的文件操作。当与data URI scheme 结合使用时,Base64 可以用于在网页和电子邮件中嵌入图像,符合 HTML 和多用途互联网邮件扩展(MIME)标准。

在这个简短教程中,我们将演示 Java 流式 I/O 功能以及内置的 Java Base64 类,展示如何将二进制数据作为 InputStream 加载,并转换为字符串

2. 准备工作

让我们看看代码所需的依赖项和测试数据。

2.1. 依赖项

我们将使用 Apache IOUtils 库,以便通过添加其到 pom.xml 中的依赖来方便访问测试数据文件:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.15.1</version>
</dependency>

2.2. 测试数据

这里需要一个二进制测试数据文件。因此,我们需要在标准的 src/test/resources 文件夹中添加一个 logo.png 图像文件。

3. 将 InputStream 转换为 Base64 字符串

Java 在 java.util.Base64 类中提供了对Base64编码和解码的内置支持。我们将使用其中的静态方法来完成主要工作。

Base64.encode() 方法期望一个 byte 数组,而我们的图像文件在文件中。因此,首先我们需要将文件转换为 InputStream,然后逐字节读取流到数组中。

我们使用 Apache commons-io 包中的 IOUtils.toByteArray() 方法,作为使用纯Java方法的一个便捷替代方案。

首先,我们编写一个简单的方法生成一个“简易校验和”:

int calculateChecksum(byte[] bytes) {
    int checksum = 0; 
    for (int index = 0; index < bytes.length; index++) {
        checksum += bytes[index]; 
    }
    return checksum; 
}

我们将用它来比较两个数组,确保它们匹配。

接下来的代码打开文件,将其转换为字节数组,然后使用 Base64 编码为字符串:

InputStream sourceStream  = getClass().getClassLoader().getResourceAsStream("logo.png");
byte[] sourceBytes = IOUtils.toByteArray(sourceStream);

String encodedString = Base64.getEncoder().encodeToString(sourceBytes); 
assertNotNull(encodedString);

这个字符串看起来像一串随机字符。实际上,它并非随机,我们在验证步骤中可以看到:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
assertNotNull(decodedBytes);
assertTrue(decodedBytes.length == sourceBytes.length);
assertTrue(calculateChecksum(decodedBytes) == calculateChecksum(sourceBytes));

4. 总结

在这篇文章中,我们展示了将 InputStream 转换为 Base64 字符串的编码过程,以及成功将该字符串解码回二进制数组。

如往常一样,本文中展示的代码可在 GitHub 上找到。