Java一直缺少BASE64编码 API,以至于通常在项目开发中会选用第三方的API实现。但是,Java 8实现了BASE64编解码API,它包含到java.util包。下面我会对Java 8的BASE64 API做一个介绍。

java.util.Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:

1)Basic编码
2)URL编码
3)MIME编码

Basic编码是标准的BASE64编码,用于处理常规的需求:输出的内容不添加换行符,而且输出的内容由字母加数字组成。下面是用法:

  1. // 编码
  2. String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
  3. System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=
  4. // 解码
  5. byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
  6. System.out.println(new String(asBytes, "utf-8")); // 输出为: some string

与早期处理BASE64编码需求相比,不可能更简单了。因为无需外部依赖:commons-codec或sun.misc.BASE64Decoder或JAXB的DatatypeConverter。

URL编码也是我们经常会面对的需求,但由于URL对反斜线“/”有特殊的意义,因此URL编码需要替换掉它,使用下划线替换。比如下面的例子:

  1. String basicEncoded = Base64.getEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
  2. System.out.println("Using Basic Alphabet: " + basicEncoded);
  3. String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
  4. System.out.println("Using URL Alphabet: " + urlEncoded);
  5. // 输出为:
  6. Using Basic Alphabet: c3ViamVjdHM/YWJjZA==
  7. Using URL Alphabet: c3ViamVjdHM_YWJjZA==

上面的例子可以看出,如果是使用基本的编码器,那么输出可能会包含反斜线“/”字符,但是如果使用URL编码器,那么输出的内容对URL来说是安全的。

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

  1. StringBuilder sb = new StringBuilder();
  2. for (int t = 0; t < 10; ++t) {
  3. sb.append(UUID.randomUUID().toString());
  4. }
  5. byte[] toEncode = sb.toString().getBytes("utf-8");
  6. String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);
  7. System.out.println(mimeEncoded);
  8. // 输出为:
  9. NDU5ZTFkNDEtMDVlNy00MDFiLTk3YjgtMWRlMmRkMWEzMzc5YTJkZmEzY2YtM2Y2My00Y2Q4LTk5
  10. ZmYtMTU1NzY0MWM5Zjk4ODA5ZjVjOGUtOGMxNi00ZmVjLTgyZjctNmVjYTU5MTAxZWUyNjQ1MjJj
  11. NDMtYzA0MC00MjExLTk0NWMtYmFiZGRlNDk5OTZhMDMxZGE5ZTYtZWVhYS00OGFmLTlhMjgtMDM1
  12. ZjAyY2QxNDUyOWZiMjI3NDctNmI3OC00YjgyLThiZGQtM2MyY2E3ZGNjYmIxOTQ1MDVkOGQtMzIz
  13. Yi00MDg0LWE0ZmItYzkwMGEzNDUxZTIwOTllZTJiYjctMWI3MS00YmQzLTgyYjUtZGRmYmYxNDA4
  14. Mjg3YTMxZjMxZmMtYTdmYy00YzMyLTkyNzktZTc2ZDc5ZWU4N2M5ZDU1NmQ4NWYtMDkwOC00YjIy
  15. LWIwYWItMzJiYmZmM2M0OTBm

java.util.Base64
类封装了所有的BASE64编码器和解码器,还支持流的封装——这是一个非常优雅的构造——包括编码和效率都很高(无需缓冲Buffer)——即编码器和
解码器的输入和输出无需缓冲Buffer。下面我们以一个例子来说明编码器是怎样封装FileOutputStream,以及解码器是怎样封装
FileInputStream的,两者皆不需要缓冲Buffer:

    1. public void wrapping() throws IOException {
    2. String src = "This is the content of any resource read from somewhere" +
    3. " into a stream. This can be text, image, video or any other stream.";
    4. // 编码器封装OutputStream, 文件/tmp/buff-base64.txt的内容是BASE64编码的形式
    5. try (OutputStream os = Base64.getEncoder().wrap(newFileOutputStream("/tmp/buff-base64.txt"))) {
    6. os.write(src.getBytes("utf-8"));
    7. }
    8. // 解码器封装InputStream, 以及以流的方式解码, 无需缓冲
    9. // is being consumed. There is no need to buffer the content of the file just for decoding it.
    10. try (InputStream is = Base64.getDecoder().wrap(newFileInputStream("/tmp/buff-base64.txt"))) {
    11. int len;
    12. byte[] bytes = new byte[100];
    13. while ((len = is.read(bytes)) != -1) {
    14. System.out.print(new String(bytes, 0, len, "utf-8"));
    15. }
    16. }
    17. }

Java 8实现BASE64编解码的更多相关文章

  1. java 图片数据Base64编解码

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  2. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  3. C++,Base64编解码字符串或文件

    参考链接:在C语言中使用libb64进行Base64编解码 GitHub地址:https://github.com/BuYishi/cpp_base64_demo base64_demo.cpp #i ...

  4. Delphi Base64 编解码函数

    Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...

  5. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  6. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  7. openssl命令行Base64编解码

    openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...

  8. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  9. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

随机推荐

  1. 用 python 解决线性代数中的矩阵运算

    用 python 解决线性代数中的矩阵运算 矩阵叉乘 矩阵求逆 矩阵转置 假定AX=B,求解未知矩阵X 矩阵的行列式值|matrix| 未完待续..... import sys from PyQt5. ...

  2. rocketmq广播消息的(五)

    一.简介 广播消费指的是:一条消息被多个consumer消费,即使这些consumer属于同一个ConsumerGroup,消息也会被ConsumerGroup中的每个Consumer都消费一次,广播 ...

  3. stop services in init

    echo 'manual' | sudo tee /etc/init/mysql.override # command from root shellecho manual >> /etc ...

  4. Android-ION内存管理简介

    ION内存管理简介 https://www.jianshu.com/p/4f681f6ddc3b http://kernel.meizu.com/memory%20management%20-%20i ...

  5. js实现全选与全部取消功能

    function checkAll() { //把所有参与选择的checkbox使用相同的name,这里为"num_iid"    var eles = document.getE ...

  6. 在vs2017和vs2019下发布应用之Windows程序打包-附图标修改和默认安装路径定义全教程

    title: 在vs2017和vs2019下发布应用之Windows程序打包-附图标修改和默认安装路径定义全教程 date: 2020-04-25 sidebarDepth: 2 tags: wind ...

  7. 微信小程序(十)

    时间机制- 响应用户交互 时间绑定 冒泡事件与非冒泡事件 bindtap 绑定 VS catchtap 绑定 button 不会阻止bindtap 向上冒泡,而如果是 catchtap 就会阻止向上冒 ...

  8. CSS学习笔记:grid布局

    目录 一.Grid布局简介 二.Grid布局的一些概念 三. 容器元素属性 1. grid-template-* 1.1 网格行和列的设置 1.2 repeat的使用 1.3 使用fr 1.4 aut ...

  9. [atARC098F]Donation

    贪心,一定在最后一次经过某节点时付出$b_{u}$,条件是付出后$W\ge \max(a_{i}-b_{i},0)$(同时也可以仅考虑这个限制,因为$W$在过程中不会增大) 假设"最后一次经 ...

  10. [loj2477]劈配

    考虑依次选择每一位考生,设当前选到第$i+1$位,前i个分别为$p1,p2,--pi$(注意:这里只确定了导师的志愿编号),然后枚举第$p_{i+1}$,通过网络流建图+判定,复杂度为$o(nm*f( ...