Base64 是一种常见的字符编码解码方式,一般用于将二进制数据编码为更具可读性的 Base64 进制格式。
在 Java 6 ( JDK 1.6 ) 之前, JDK 一直没有包含 Base64 的实现类。因此大部分人都使用 Sum/Orale JDK 里面的 sun.misc.BASE64Encode 和sun.misc.BASE64Decode。然后这也成为很多 Java 开发者的习惯。一直沿用到今天的 Java8 中还有人在用。
JDK 1.6 虽然添加了 Base64 的实现。但是,非常隐秘,竟然是在 javax.xml.bind 包下的 DatastypeConvert 类中的两个静态方法 parseBase64Binary 和 printBase64Binary.
Java 8 终于把 Base64 扶正了,在 java.util 包下提供了 Base64 类用于编码和解码 Base64 数据。
Java 8 java.util.Base64
Java 8 中的 java.util.Base64 类提供了三种类型的 Base64 编码解码格式:
1、 编码字符只包含 等 64 个字符。且编码的时候不会包含任何换行符 ( 、 、 )。解码的时候也只会解码 内的字符,超出的则会被拒绝。
2、 编码字符只包含 等 64 个字符。和 相比,就是把 换成了 。因为没有 字符,因此这种编码方式非常适合 URL 和文件名等。
3、 编码会被映射为 MIME 友好格式:每一行输出不超过 76 个字符,而且每行以 符结束。但末尾行并不会包含 。
内部类
java.util.Base64 还包含了两个内部静态类,分别实现了 RFC 4648 和 RFC 2045 中规范的 Base64 编码和解码方式。
| 内部类 | 说明 |
|---|---|
| static class Base64.Decoder | 该类实现使用 RFC 4648 和 RFC 2045 中规定的 Base64 解码方案解码数据 |
| static class Base64.Encoder | 该类实现使用 RFC 4648 和 RFC 2045 中规定的 Base64 编码方案编码数据 |
每个内部类的方法详情,请直接点击相关 URL 查看。
静态方法
java.util.Base64 类提供的都是静态方法。下表列出了这些静态方法
| 方法 | 说明 |
|---|---|
| Base64.Decoder getDecoder() | 返回一个 Base64.Decoder 类型的 简单 解码器 |
| Base64.Encoder getEncoder() | 返回一个 Base64.Encoder 类型的 简单 编码器 |
| Base64.Decoder getMimeDecoder() | 返回一个 Base64.Decoder 类型的 MIME 解码器 |
| Base64.Encoder getMimeEncoder() | 返回一个 Base64.Encoder 类型的 MINE 编码器 |
| Base64.Encoder getMimeEncoder( int lineLength, byte[] lineSeparator) | 返回一个 Base64.Encoder 类型的使用特定长度和行分隔符的 MINE 编码器 |
| Base64.Decoder getUrlDecoder() | 返回一个 Base64.Decoder 类型的 URL 和文件名安全的解码器 |
| Base64.Encoder getUrlEncoder() | 返回一个 Base64.Encoder 类型的 URL 和文件名安全的编码器 |
基本的编码解码器
我们写一个范例演示下 getDecoder() 和 getEncoder() 两个方法。
import java.util.Base64;
import java.io.UnsupportedEncodingException;
public class XinTuBase64Tester {
public static void main(String args[]) {
try {
String base64encodedString = Base64.getEncoder().encodeToString(
"Java 8 Base64 编码解码".getBytes("utf-8"));
System.out.println(base64encodedString);
System.out.println();
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch(UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
}
URL 和文件名安全的编码解码器
我们写一个范例演示下 getUrlEncoder() 和 getUrlDecoder() 两个方法.
import java.util.Base64;
import java.io.UnsupportedEncodingException;
public class XinTuBase64Tester {
public static void main(String args[]) {
try {
String base64encodedString = Base64.getUrlEncoder().encodeToString(
"Java 8 Base64 编码解码 ".getBytes("utf-8"));
System.out.println(base64encodedString);
System.out.println();
byte[] base64decodedBytes = Base64.getUrlDecoder().decode(base64encodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch(UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
}
MIME Base64 编码解码器
我们写一个范例演示下 getMimeEncoder() 和 getMimeDecoder() 两个方法.
import java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;
public class XinTuBase64Tester {
public static void main(String args[]) {
try {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println(mimeEncodedString);
System.out.println();
byte[] base64decodedBytes = Base64.getMimeDecoder().decode(mimeEncodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch(UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
}
import java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;
public class XinTuBase64Tester {
public static void main(String args[]) {
try {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
String mimeEncodedString = Base64.getMimeEncoder(32,"@~@\n\n".getBytes("utf-8")).encodeToString(mimeBytes);
System.out.println(mimeEncodedString);
System.out.println();
byte[] base64decodedBytes = Base64.getMimeDecoder().decode(mimeEncodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch(UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
}