Java 8新特性(8) Base64

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

在 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 包下面,不被很多开发者知道。

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

Basic 编码

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

// 编码
String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64);  // c29tZSBzdHJpbmc=
// 解码
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8"));  // some string

URL 编码

使用下划线替换 URL 里面的反斜线 /

// 编码
String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println(urlEncoded);  // c3ViamVjdHM_YWJjZA==
// 解码
new String(Base64.getUrlDecoder().decode(urlEncoded), "utf-8");  // subjects?abcd

MIME 编码

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

// 编码
StringBuilder sb = new StringBuilder();
for (int t = 0; t < 10; ++t) {
  sb.append(UUID.randomUUID().toString());
}
byte[] toEncode = sb.toString().getBytes("utf-8");
String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);
System.out.println(mimeEncoded);

// ZDRlYWEwM2YtZTFhMy00ODhlLTkxYTctYzhlMGIyZDE2MTZkNTE1NDY1MjctYTNmOS00NGI5LTk2
// NjEtOWJmYTNmMGFmMTkzNjY5N2Q2ZTEtY2E5My00ZmViLWE2ZWUtNjkzMGEzMzlkZGEyZTQyZTZi
// M2QtMGM4YS00YTM2LWIwY2EtNjM4MzVjNjkyOTliYzUxOTkxZjMtY2Y0OC00ODk4LTkyM2EtNzhi
// MjE5OGQzNmQ2ZThiNTNlZWUtYzYxMS00OTAxLWI0MmYtNGQ1YzgzNTYxZDkwYzk2Y2IzMTktOGJl
// ZS00NjBkLTk1ZTAtNDM5Y2NiM2UyZDc0ZjM5ZDFjNjMtMzY1OS00MDEwLTlmOTUtZWEwYzMyOTc5
// NDUzNWYxOTQ4ODQtMDczNi00MjllLWIxZmItNTgzMmY1NDBkOWMwN2VlOTE0OGYtMDhiNS00OWUz
// LTk4MzQtODkxYTNmY2IxYzU0

// 解码
new String(Base64.getMimeDecoder().decode(mimeEncoded), "utf-8");
// d4eaa03f-e1a3-488e-91a7-c8e0b2d1616d51546527-a3f9-44b9-9661-9bfa3f0af1936697d6e1-ca93-4feb-a6ee-6930a339dda2e42e6b3d-0c8a-4a36-b0ca-63835c69299bc51991f3-cf48-4898-923a-78b2198d36d6e8b53eee-c611-4901-b42f-4d5c83561d90c96cb319-8bee-460d-95e0-439ccb3e2d74f39d1c63-3659-4010-9f95-ea0c329794535f194884-0736-429e-b1fb-5832f540d9c07ee9148f-08b5-49e3-9834-891a3fcb1c54

static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)

返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案,可以通过参数指定每行的长度及行的分隔符。

Base64.getMimeEncoder(80, ", ".getBytes("utf-8")).encodeToString(toEncode);  // 每行 80 个字符,以“, ”分隔

https://my.oschina.net/benhaile/blog/267738


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:Java 8新特性(8) Base64

文章字数:484

本文作者:Bin

发布时间:2019-03-13, 21:18:22

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2019/03/13/Java8/Java%208%E6%96%B0%E7%89%B9%E6%80%A7(8)%20Base64/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录