1. 首页
  2. java8教程

005-五、Java 8 java.util.Base64 编码解码

引言

Base64 是一种常见的字符编码解码方式,一般用于将二进制数据编码为更具可读性的 Base64 进制格式。

Java 6 ( JDK 1.6 ) 之前, JDK 一直没有包含 Base64 的实现类。因此大部分人都使用 Sum/Orale JDK 里面的 sun.misc.BASE64Encodesun.misc.BASE64Decode。然后这也成为很多 Java 开发者的习惯。一直沿用到今天的 Java8 中还有人在用。

JDK 1.6虽然添加了 Base64 的实现。但是,非常隐秘,竟然是在 javax.xml.bind 包下的 DatastypeConvert 类中的两个静态方法 parseBase64BinaryprintBase64Binary.

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 4648RFC 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 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:005-五、Java 8 java.util.Base64 编码解码

    链接:https://www.javajike.com/article/1414.html

« 000-Java9系列
020-二十、Java 8 函数接口 ( Functional interface )»

相关推荐

QR code