005-五、Java 8 java.util.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
编码和解码方式。
内部类 | 说明 |
---|---|
内部类 | 说明 |
staticclassBase64.Decoder | 该类实现使用RFC4648和RFC2045中规定的Base64解码方案解码数据 |
staticclassBase64.Encoder | 该类实现使用RFC4648和RFC2045中规定的Base64编码方案编码数据 |
每个内部类的方法详情,请直接点击相关 URL 查看。
静态方法
java.util.Base64
类提供的都是静态方法。下表列出了这些静态方法
方法 | 说明 |
---|---|
方法 | 说明 |
Base64.DecodergetDecoder() | 返回一个Base64.Decoder 类型的简单解码器 |
Base64.EncodergetEncoder() | 返回一个Base64.Encoder 类型的简单编码器 |
Base64.DecodergetMimeDecoder() | 返回一个Base64.Decoder 类型的MIME解码器 |
Base64.EncodergetMimeEncoder() | 返回一个Base64.Encoder类型的MINE编码器 |
Base64.EncodergetMimeEncoder(intlineLength,byte[]lineSeparator) | 返回一个Base64.Encoder类型的使用特定长度和行分隔符的MINE编码器 |
Base64.DecodergetUrlDecoder() | 返回一个Base64.Decoder类型的URL和文件名安全的解码器 |
Base64.EncodergetUrlEncoder() | 返回一个Base64.Encoder类型的URL和文件名安全的编码器 |
范例一: 基本的编码解码器
我们写一个范例演示下 getDecoder()
和 getEncoder()
两个方法
Base64Tester.java
import java.util.Base64;
import java.io.UnsupportedEncodingException;
public class Base64Tester {
public static void main(String args[]) {
try {
String base64encodedString = Base64.getEncoder().encodeToString(
"Java 8 Base64 编码解码 - Java8新特性 - 研发军团 ".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());
}
}
}
//运行以上范例,输出结果如下
[penglei@tech.souyunku.com helloworld]$ javac Base64Tester.java && java Base64Tester
SmF2YSA4IEJhc2U2NCDnvJbnoIHop6PnoIEgLSBKYXZhOOaWsOeJueaApyAtIOeugOWNleaVmeeoiyA=
Java 8 Base64 编码解码 - Java8新特性 - 研发军团
范例二: URL 和文件名安全的编码解码器
我们写一个范例演示下 getUrlEncoder()
和 getUrlDecoder()
两个方法
Base64Tester.java
import java.util.Base64;
import java.io.UnsupportedEncodingException;
public class Base64Tester {
public static void main(String args[]) {
try {
String base64encodedString = Base64.getUrlEncoder().encodeToString(
"Java 8 Base64 编码解码 - Java8新特性 - 研发军团 ".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());
}
}
}
运行以上范例,输出结果如下
[penglei@tech.souyunku.com helloworld]$ javac Base64Tester.java && java Base64Tester
SmF2YSA4IEJhc2U2NCDnvJbnoIHop6PnoIEgLSBKYXZhOOaWsOeJueaApyAtIOeugOWNleaVmeeoiyA=
Java 8 Base64 编码解码 - Java8新特性 - 研发军团
范例三:MIME Base64 编码解码器
我们写一个范例演示下 getMimeEncoder()
和 getMimeDecoder()
两个方法
Base64Tester.java
import java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;
public class Base64Tester {
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());
}
}
}
//运行以上范例,输出结果如下
[penglei@tech.souyunku.com helloworld]$ javac Base64Tester.java && java Base64Tester
YTU3MTc4MTgtZDFhMS00MjJmLWEyYjgtNTczNzdjMjQ4N2VlZWE4OGVmNTgtNjA3YS00MWY5LTk0
OTAtNjhmNTk1NGIwZGYwYmU0NzA3NjgtOGU0OS00MjBiLWE1YTktYjM1NDcyOTI2MjkwZmExMTdh
NWQtMmRlMi00ZjllLTk1YmUtZWE0MzZlMWEwZmYxZjU2NzE5YWEtMTQzNy00YzZmLTgyNGQtNzFm
YTNkZmVkNjBiNWE4ODViMmYtNjQ3NC00ODY2LThhMDEtMmRkMWY5NmQ5ZDgyMjNiNjAyMjgtNmY3
NC00NGZjLWI3NWItM2Y3YzFmODlmOTIxYjA0ODE2ZjEtYTliZC00NjNkLTkxYWEtZDc3NDlhZGUx
MTU4M2ZiMjJhZDItNzRmNS00Y2IxLTkyNmItY2Y4ZjZkNzc4OWVlZmJiMWQwYjMtZGE0MS00OTBi
LWJmYWMtMTVmNjVmMjIxODc4
a5717818-d1a1-422f-a2b8-57377c2487eeea88ef58-607a-41f9-9490-68f5954b0df0be470768-8e49-420b-a5a9-b35472926290fa117a5d-2de2-4f9e-95be-ea436e1a0ff1f56719aa-1437-4c6f-824d-71fa3dfed60b5a885b2f-6474-4866-8a01-2dd1f96d9d8223b60228-6f74-44fc-b75b-3f7c1f89f921b04816f1-a9bd-463d-91aa-d7749ade11583fb22ad2-74f5-4cb1-926b-cf8f6d7789eefbb1d0b3-da41-490b-bfac-15f65f221878
是不是看不出来有 76 个字符分割 ? 没关系,我们使用另一个getMimeEncoder(int lineLength, byte[] lineSeparator)
重载方法试一下
Base64Tester.java
import java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;
public class Base64Tester {
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());
}
}
}
运行以上范例,输出结果如下
[penglei@tech.souyunku.com helloworld]$ javac Base64Tester.java && java Base64Tester
OTkwNWYxY2QtMDBkYS00Y2M1LTgwMGUt@~@
YjgzYTNkNGZlMGJhNGNmM2Q2YzItODli@~@
ZS00ZDQyLWI1MzEtYTEwMmRhNzk2ZjBi@~@
Njk0MWNmMzItYzhlZS00NjE0LTk5NWMt@~@
ODUwYWM0NDE3YTEyYzdjOTBkMGMtOTZl@~@
Ny00MjkxLThmOGUtM2JkYWQ4NmY4YjU1@~@
Nzk2NmZhYjItZmY0YS00ZTc1LThiOTUt@~@
Mzk5MjAxMWM0ZTMwODdjYzdhYjAtZjEx@~@
MC00NDAwLTkzN2EtZTU0N2IzYTY5Mzkx@~@
MzNlNjYyYjAtYTM5Yy00OTJjLWI4Mzgt@~@
ZmRmYzkyMGM4ZGEzM2NlMWVmOTgtMWI3@~@
OS00Y2Q0LWI1NGItYjg2MzkzNDhiMDk1@~@
YmQ1ZjE5NzAtNjliYS00NTRmLTgyNTAt@~@
MjNlZmZkMGVjOWU0MDk1YTAyM2MtZTUz@~@
NS00NTZiLTk4ZjQtNTkyMGE0Y2FiYTdk
f1cd-00da-4cc5-800e-b83a3d4fe0ba4cf3d6c2-89be-4d42-b531-a102da796f0b6941cf32-c8ee-4614-995c-850ac4417a12c7c90d0c-96e7-4291-8f8e-3bdad86f8b557966fab2-ff4a-4e75-8b95-3992011c4e3087cc7ab0-f110-4400-937a-e547b3a6939133e662b0-a39c-492c-b838-fdfc920c8da33ce1ef98-1b79-4cd4-b54b-b8639348b095bd5f1970-69ba-454f-8250-23effd0ec9e4095a023c-e535-456b-98f4-5920a4caba7d
在这个范例中,我们每隔 32 个字符就分割一次。且使用 @~@\n\n
作为分隔符。
写完了如果写得有什么问题,希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com