"General" 我是个将军

“ You, sir a hyena. I hava no wish to speak to you.”  “你就是一个土狗,你不配跟我说话”

一、基本介绍

  在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议用Sun/Oracle JDK里面的sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder,使用它们的优点就是不需要依赖第三方类库,缺点就是可能在未来版本会被删除(用maven编译会发出警告),而且性能不佳。JDK1.6中添加了另一个Base64的实现,javax.xml.bind.DatatypeConverter两个静态方法parseBase64Binary 和 printBase64Binary,隐藏在javax.xml.bind包下面,不被很多开发者知道。在Java 8在java.util包下面实现了BASE64编解码API,而且性能不俗,API也简单易懂。我们先来了解一下Base64是干嘛的:

  知乎上有个非常易懂解释链接:https://www.zhihu.com/question/36306744/answer/71626823 ,如下为回答内容:
  1. 我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。
  2. 所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
  3. 对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
  4.  
  5. 那么Base64到底是怎样编码的呢?
  6. 简单来说,任何一个数据无非可以看作一个比特流,如01000100010011101100111010111100011001010......那么我们取6个比特为一组,计算它的ascii值,得到一个字符,这个字符肯定是可见字符,好,把它对应的字符写出来,再取6个比特,计算...,如此下去,直到最后,就完成了编码。
  7. 1.标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;
  8. 2.base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);
  9. 3.等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是012
  10. 4.严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴;

二、基本使用

方法概览

  1. 1static Base64.Decoder getDecoder()
  2. 返回Base64.Decoder解码使用基本型base64编码方案。
  3. 2static Base64.Encoder getEncoder()
  4. 返回Base64.Encoder编码使用的基本型base64编码方案。
  5. 3static Base64.Decoder getMimeDecoder()
  6. 返回Base64.Decoder解码使用MIME类型的base64解码方案。
  7. 4static Base64.Encoder getMimeEncoder()
  8. 返回Base64.Encoder编码使用MIME类型base64编码方案。
  9. 5static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)
  10. 返回Base64.Encoder编码使用指定的行长度和线分隔的MIME类型base64编码方案。
  11. 6static Base64.Decoder getUrlDecoder()
  12. 返回Base64.Decoder解码使用URL和文件名安全型base64编码方案。
  13. 7static Base64.Encoder getUrlEncoder()
  14. 返回Base64.Decoder解码使用URL和文件名安全型base64编码方案。

  

该类提供了一套静态方法获取下面三种BASE64编解码器:

1)Basic编码:是标准的BASE64编码,用于处理常规的需求

  1. try {
  2. // 编码
  3. String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
  4. System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=
  5. // 解码
  6. byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
  7. System.out.println(new String(asBytes, "utf-8")); // 输出为: some string
  8. }catch (java.io.UnsupportedEncodingException e){
  9. e.printStackTrace();
  10. }

  

2)URL编码:使用下划线替换URL里面的反斜线“/”

  1. try {
  2. // 编码
  3. String asB64 = Base64.getUrlEncoder().encodeToString("some string/".getBytes("utf-8"));
  4. System.out.println(asB64); // 输出为: c29tZSBzdHJpbmcv
  5. // 解码
  6. byte[] asBytes = Base64.getUrlDecoder().decode("c29tZSBzdHJpbmcv");
  7. System.out.println(new String(asBytes, "utf-8")); // 输出为: some string/
  8. }catch (java.io.UnsupportedEncodingException e){
  9. e.printStackTrace();
  10. }

3)MIME编码:使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束。

  1. try {
  2. // 编码
  3. String asB64 = Base64.getMimeEncoder().encodeToString("some string/".getBytes("utf-8"));
  4. System.out.println(asB64); // 输出为: c29tZSBzdHJpbmcv
  5. // 解码
  6. byte[] asBytes = Base64.getMimeDecoder().decode("c29tZSBzdHJpbmcv");
  7. System.out.println(new String(asBytes, "utf-8")); // 输出为: some string/
  8. }catch (java.io.UnsupportedEncodingException e){
  9. e.printStackTrace();
  10. }

  

方法使用起来非常相近,也很好用。

参考链接:

https://www.zhihu.com/question/36306744/answer/71626823

图片来源:八恶人(movie)

Java 8新特性之 Base64(八恶人-7)的更多相关文章

  1. Java 8新特性探究(八)精简的JRE详解

    http://www.importnew.com/14926.html     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...

  2. [转帖]Java 8新特性探究(八)精简的JRE详解

    Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api   撸了今年阿里.网易和美团的面试,我有一个重要发 ...

  3. Java 8 新特性终极版

    声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

  4. Java 8新特性前瞻

    快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...

  5. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  6. 乐字节-Java8新特性之Base64和重复注解与类型注解

    上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...

  7. Java-Runoob-高级课程:Java 8 新特性

    ylbtech-Java-Runoob-高级课程:Java 8 新特性 1.返回顶部 1. Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Or ...

  8. Java 8 新特性终极指南

    1.前言 毫无疑问,Java 8的发布是自从Java5以来Java世界中最重大的事件,它在编译器.工具类和Java虚拟机等方面为Java语言带来的很多新特性.在本文中我们將一起关注下这些新变化,使用实 ...

  9. Java 8 新特性——检视阅读

    Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...

随机推荐

  1. mysql导出CSV格式的文件

    select  *  from  Account  into outfile "/tmp/haha.csv" fields terminated by ',' lines term ...

  2. 三、java三大特性--多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  3. security相关链接整理

    token令牌 ssl协议 https协议 对称加密与非对称加密 认识ASP.NET Windows身份认证

  4. 各种工业以太网比较(EtherCAT,EtherNet/IP,ProfiNet,Modbus-TCP,Powerlink)

    EtherCAT(以太网控制自动化技术)是一个以以太网为基础的开放架构的现场总线系统,EterCAT名称中的CAT为ControlAutomation Technology(控制自动化技术)首字母的缩 ...

  5. ES6入门之let、cont

    一.前提 解决ES5中只有全局作用域和函数作用域,没有块级作用域而带来的不合理的场景. let 基本用法 用法和var 一样,只是let声明的变量只有在let命令所在的代码块有效 { let a = ...

  6. vsftpd虚拟账户配置

    1. 概述 FTP是文件传输协议,在内外网的文件传输中使用广泛. 本篇博客主要介绍FTP服务器的部署和测试. 2. 软件环境部署 查看系统是否安装FTP软件(vsftpd),执行命令:rpm -qa ...

  7. NFS共享文件系统部署

    1. 概述 本篇博客主要是介绍如何安装和使用NFS服务. 2. 安装软件包 首先确认系统是否已经安装相应的软件包,执行命:rpm -qa | egrep "rpcbind|nfs-utils ...

  8. asp.net mvc接收安卓post的json字符串

    筛选器: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syst ...

  9. 微信小程序开发工具 ubuntu linux版本

    安装 http://blog.csdn.net/zhangyingguangails/article/details/72517182 sudo apt install wine sudo git c ...

  10. C_数据结构_循环实现求阶乘

    # include <stdio.h> int main(void) { int val; printf("请输入一个数字:"); printf("val = ...