# Java Base64 编码和解码示例

> 原文： [https://howtodoinjava.com/java8/base64-encoding-and-decoding-example-in-java-8/](https://howtodoinjava.com/java8/base64-encoding-and-decoding-example-in-java-8/)

在 Java 8 学习系列中，我们已经学习了[**使用流**](//howtodoinjava.com/java8/read-file-line-by-line-in-java-8-streams-of-lines-example/ "Read file line by line in java 8: Streams of Lines Example")逐行读取文件的新方法。 Java 8 引入了与 IO 操作相关的另一项很好的附加特性，即 [**Base64**](https://en.wikipedia.org/wiki/Base64 "base64 wiki") 支持。 在这篇文章中，我们将学习它。

## 什么是 Base64 编码？

当您有一些二进制数据要通过网络传输时，通常不这样做，只是将数据以原始格式通过网络转换为比特流。 为什么？ 因为某些媒体仅用于**流文本**。 这些协议可能会将您的二进制数据解释为不是的控制字符。

`Base64`编码将您的二进制数据转换为 64 个可打印的`ASCII`字符。 通常，它是对电子邮件消息中的二进制数据和`"basic"` HTTP 身份验证完成的。 这 64 个可打印字符是：

*   26 个大写字母`[A…Z]`
*   26 个小写字母`[a…z]`
*   10 位数字`[0…9]`
*   2 个符号（[阅读更多](https://en.wikipedia.org/wiki/Base64#Implementations_and_history "Base64 special characters")）

具有上述字符的编码字符串可以安全地在支持文本数据的网络上传输，而不必担心由于控制字符的混乱而丢失数据。

## Java 8 之前的 Base64 支持

多年来，java 通过非公共类（因此不可使用）`java.util.prefs.Base64`和未记录的类`sun.misc.BASE64Encoder`为 Base64 提供了支持。 此类在公共领域中的信息也非常有限。

## Java 8 对 Base64 的支持

Java 8 添加了一个用于 Base64 编码和解码目的的类，即[**`java.util.Base64`**](https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html "base64 java doc")。 我们将在下面的代码示例中使用它。

#### 1）将字符串编码为 Base64

这就像获取编码器实例并将字符串作为字节输入以对其进行编码一样简单。

```java
Base64.Encoder encoder = Base64.getEncoder();
String normalString = "username:password";
String encodedString = encoder.encodeToString( 
        normalString.getBytes(StandardCharsets.UTF_8) );

Output:

dXNlcm5hbWU6cGFzc3dvcmQ=

```

#### 2）解码 base64 的编码字符串

这也很简单。 只需获取`Base64.Decoder`的实例，并使用它来解码以 base64 编码的字符串。

```java
String encodedString = "dXNlcm5hbWU6cGFzc3dvcmQ=";
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedByteArray = decoder.decode(encodedString);
//Verify the decoded string
System.out.println(new String(decodedByteArray));

Output:

username:password

```

#### 3）包装 base64 的编码输出流

如果您不想直接使用数据，而更喜欢使用流，则可以包装输出流，以使写入此输出流的所有数据都将自动以 base64 编码。

```java
Path originalPath = Paths.get("c:/temp", "mail.txt");
Path targetPath = Paths.get("c:/temp", "encoded.txt");
Base64.Encoder mimeEncoder = Base64.getMimeEncoder();
try(OutputStream output = Files.newOutputStream(targetPath)){
    //Copy the encoded file content to target file
    Files.copy(originalPath, mimeEncoder.wrap(output));
    //Or simply use the encoded output stream
    OutputStream encodedStrem = mimeEncoder.wrap(output);
}

```

仅此而已。 这已经足够简单了。

**祝您学习愉快！**