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)