Java 8:Base64 编码与解码
2022-02-15 09:02:07
`Java 8` 中,新增了 `java.util.Base64` 工具类,可以用于 `Base64` 编码与解码。编码器和解码器分为三种:
- 基础 `Base64` 编码器与基础 `Base64` 解码器
- `URL Base64` 编码器与 `URL Base64` 解码器
- `MIME Base64` 编码器与 `MIME Base64` 解码器
另外还可以调用以上三种编码器的 `withoutPadding()` 方法,获取一个无填充编码器。
### 基础 `Base64` 编码器与基础 `Base64` 解码器
使用 `Base64` 编码一个字符串:
```java
String originalInput = "test input";
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());
```
使用 `Base64` 解码一个字符串:
```java
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
```
### `URL Base64` 编码器与 `URL Base64` 解码器
`URL` 编码类似基础编码器,它使用文件名安全的 `Base64` 字母,并且不带行分割。
```java
String originalUrl = "https://www.google.co.nz/?
gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java";
String encodedUrl =
Base64.getUrlEncoder().encodeToString(originalURL.getBytes());
```
使用 `getUrlDecoder()` 方法获取一个 `java.util.Base64.Decoder` 类,可以用它来解码 `URL`。
```java
byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);
String decodedUrl = new String(decodedBytes);
```
### `MIME Base64` 编码器与 `MIME Base64` 解码器
`MIME` 编码器使用基础字符生成 `Base64` 编码的输出,并且格式是 `MIME` 友好的。输出的每行都不超过 `76` 个字符,并以回车换行 `\r\n` 结尾。
首先编写用于生成 `MIME` 输入的方法:
```java
private static StringBuilder getMimeBuffer() {
StringBuilder buffer = new StringBuilder();
for (int count = 0; count < 10; ++count) {
buffer.append(UUID.randomUUID().toString());
}
return buffer;
}
```
使用 `MIME Base64` 编码器进行编码:
```java
StringBuilder buffer = getMimeBuffer();
byte[] encodedAsBytes = buffer.toString().getBytes();
String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);
```
使用 `MIME Base64` 解码器进行解码:
```java
byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
String decodedMime = new String(decodedBytes);
```
### 无填充编码器
在 `Base64` 编码中,解码输出的字符串的长度必须是 `3` 的倍数,编码器会在输出结果后面按需添加一个或者两个 `=` 来满足这一要求。在解码的时候,解码器会丢弃这些多余的填充字符。
有些时候,我们想跳过填充输出结果的步骤,比如结果字符串永远不会被解码回来,此时可以选择*无填充编码器*。调用编码器的 `withoutPadding()` 可以获取相应的无填充编码器。
```java
String encodedString =
Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBy
tes());
```
---
## 参考资料
- [runnoob:Java8 Base64](https://www.runoob.com/java/java8-base64.html)
- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)