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 上找到。