Java 8 Base64 编码解码
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、 简单类型( simple
) : 编码字符只包含 A-Za-z0-9+/
等 64 个字符。且编码的时候不会包含任何换行符 ( \r 、 \n 、\r\n
)。解码的时候也只会解码 A-Za-z0-9+/
内的字符,超出的则会被拒绝。
2、 URL
: 编码字符只包含 A-Za-z0-9+_
等 64
个字符。和 简单 相比,就是把 /
换成了_
。因为没有 /
字符,因此这种编码方式非常适合 URL
和文件名等。
3、 MIME
: 编码会被映射为 MIME
友好格式:每一行输出不超过 76
个字符,而且每行以 \r\n
符结束。但末尾行并不会包含 \r\n
。
内部类
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()
两个方法
Base64Test编码解码
@Test
public void Base64Test() {
try {
String text = "Java 8 Base64 编码解码 - Java8新特性";
String base64encodedString = Base64.getEncoder().encodeToString(text.getBytes("utf-8"));
System.out.println(base64encodedString);
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch (UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
/*
执行结果:
SmF2YSA4IEJhc2U2NCDnvJbnoIHop6PnoIEgLSBKYXZhOOaWsOeJueaApw==
Java 8 Base64 编码解码 - Java8新特性
*/
范例二: URL 和文件名安全的编码解码器
我们写一个范例演示下 getUrlEncoder()
和 getUrlDecoder()
两个方法
Base64Test编码解码
@Test
public void Base64Test() {
try {
String text = "Java 8 Base64 编码解码 - Java8新特性";
String base64encodedString = Base64.getUrlEncoder().encodeToString(text.getBytes("utf-8"));
System.out.println(base64encodedString);
byte[] base64decodedBytes = Base64.getUrlDecoder().decode(base64encodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch (UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
/*
执行结果:
SmF2YSA4IEJhc2U2NCDnvJbnoIHop6PnoIEgLSBKYXZhOOaWsOeJueaApw==
Java 8 Base64 编码解码 - Java8新特性
*/
范例三:MIME Base64 编码解码器
我们写一个范例演示下 getMimeEncoder()
和 getMimeDecoder()
两个方法
Base64Test编码解码
@Test
public void Base64Test() {
try {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 5; ++i) {
stringBuilder.append(UUID.randomUUID());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println(mimeEncodedString+"\n");
byte[] base64decodedBytes = Base64.getMimeDecoder().decode(mimeEncodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch (UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
/*
执行结果:
M2EzOWFhMTYtZWRkMS00ZDI2LTg2YTAtYmJhZWNkOTkwNWI2ZjA2MjE2NzgtYzdlZi00ODRhLTlh
Y2ItZDdmM2M5ODVmMWY3NDg1Nzk4NzItZWM1OC00ZWEwLWE4ZjctYzIzMTFhN2Q1MDUzMzZhMzhj
NmQtOWUzYy00NjBiLWE2MTQtYTE4YzQwMTYxYTliZmVlNzgxMDAtZjMzNi00ZmU4LTg0ZTYtZWFi
MzIwODcyMzIy
3a39aa16-edd1-4d26-86a0-bbaecd9905b6f0621678-c7ef-484a-9acb-d7f3c985f1f748579872-ec58-4ea0-a8f7-c2311a7d505336a38c6d-9e3c-460b-a614-a18c40161a9bfee78100-f336-4fe8-84e6-eab320872322
*/
是不是看不出来有 76 个字符分割 ? 没关系,我们使用另一个getMimeEncoder(int lineLength, byte[] lineSeparator)
重载方法试一下
Base64Test编码解码
@Test
public void Base64Test() {
try {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 5; ++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+"\n-----------分隔线--------------");
byte[] base64decodedBytes = Base64.getMimeDecoder().decode(mimeEncodedString);
System.out.println(new String(base64decodedBytes, "utf-8"));
} catch (UnsupportedEncodingException e) {
System.out.println("异常:" + e.getMessage());
}
}
/*
执行结果:
N2ViMjI3ODQtODUwMy00YmNhLWI5Njct@~@
ZTEzZTY0MmEzYjc2YjM4ZmI4MDMtMDEw@~@
Yi00NzE2LWE3MDgtNmRmMmM4NDkyN2Vl@~@
M2IzNzA3MzEtNGQ3Yi00NmY3LThiOTMt@~@
ZTc3OGJjMmExM2I5N2QyNDlmN2EtNzE4@~@
Zi00ZDU4LWFmYzQtZTI3YjMwNzVkMWIz@~@
MmFkOWZlZWItYWI5Yy00N2RlLWIyNzQt@~@
MjI5YTY2N2QyYmMx
-----------分隔线--------------
7eb22784-8503-4bca-b967-e13e642a3b76b38fb803-010b-4716-a708-6df2c84927ee3b370731-4d7b-46f7-8b93-e778bc2a13b97d249f7a-718f-4d58-afc4-e27b3075d1b32ad9feeb-ab9c-47de-b274-229a667d2bc1
*/
在这个范例中,我们每隔 32 个字符就分割一次。且使用 @~@\n\n
作为分隔符。