Java Base64 编码解码方案总结

Wesley13
• 阅读 702

Java技术栈,每天给你诚意满满的干货

Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便。在实际应用上,Base64除了能将Binary资料可视化之外,也常用来表示字串加密过后的内容。如果要使用Java 程式语言来实作Base64的编码与解码功能,可以参考本篇文章的作法。

早期作法

早期在Java上做Base64的编码与解码,会使用到JDK里sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类别,用法如下:

  1. final BASE64Encoder encoder = new BASE64Encoder();

  2. final BASE64Decoder decoder = new BASE64Decoder();

  3. final String text = "Java技术栈";

  4. final byte[] textByte = text.getBytes("UTF-8");

  5. //编码

  6. final String encodedText = encoder.encode(textByte);

  7. System.out.println(encodedText);

  8. //解码

  9. System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));

  10. final BASE64Encoder encoder = new BASE64Encoder();

  11. final BASE64Decoder decoder = new BASE64Decoder();

  12. final String text = "Java技术栈";

  13. final byte[] textByte = text.getBytes("UTF-8");

  14. //编码

  15. final String encodedText = encoder.encode(textByte);

  16. System.out.println(encodedText);

  17. //解码

  18. System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));

从以上程式可以发现,在Java用Base64一点都不难,不用几行程式码就解决了!只是这个sun.mis c套件所提供的Base64功能,编码和解码的效率并不太好,而且在以后的Java版本可能就不被支援了,完全不建议使用。

Apache Commons Codec作法

Apache Commons Codec有提供Base64的编码与解码功能,会使用到org.apache.commons.codec.binary套件下的Base64类别,用法如下:

  1. final Base64 base64 = new Base64();

  2. final String text = "Java技术栈";

  3. final byte[] textByte = text.getBytes("UTF-8");

  4. //编码

  5. final String encodedText = base64.encodeToString(textByte);

  6. System.out.println(encodedText);

  7. //解码

  8. System.out.println(new String(base64.decode(encodedText), "UTF-8"));

  9. final Base64 base64 = new Base64();

  10. final String text = "Java技术栈";

  11. final byte[] textByte = text.getBytes("UTF-8");

  12. //编码

  13. final String encodedText = base64.encodeToString(textByte);

  14. System.out.println(encodedText);

  15. //解码

  16. System.out.println(new String(base64.decode(encodedText), "UTF-8"));

以上的程式码看起来又比早期用sun.mis c套件还要更精简,效能实际执行起来也快了不少。缺点是需要引用Apache Commons Codec,很麻烦。

Java 8之后的作法

Java 8的java.util套件中,新增了Base64的类别,可以用来处理Base64的编码与解码,用法如下:

  1. final Base64.Decoder decoder = Base64.getDecoder();

  2. final Base64.Encoder encoder = Base64.getEncoder();

  3. final String text = "Java技术栈";

  4. final byte[] textByte = text.getBytes("UTF-8");

  5. //编码

  6. final String encodedText = encoder.encodeToString(textByte);

  7. System.out.println(encodedText);

  8. //解码

  9. System.out.println(new String(decoder.decode(encodedText), "UTF-8"));

  10. final Base64.Decoder decoder = Base64.getDecoder();

  11. final Base64.Encoder encoder = Base64.getEncoder();

  12. final String text = "Java技术栈";

  13. final byte[] textByte = text.getBytes("UTF-8");

  14. //编码

  15. final String encodedText = encoder.encodeToString(textByte);

  16. System.out.println(encodedText);

  17. //解码

  18. System.out.println(new String(decoder.decode(encodedText), "UTF-8"));

与sun.mis c套件和Apache Commons Codec所提供的Base64编解码器来比较的话,Java 8提供的Base64拥有更好的效能。实际测试编码与解码速度的话,Java 8提供的Base64,要比sun.mis c套件提供的还要快至少11倍,比Apache Commons Codec提供的还要快至少3倍。因此在Java上若要使用Base64,这个Java 8底下的java .util套件所提供的Base64类别绝对是首选!

参考:https://magiclen.org/java-base64/

推荐1:向高手进阶:一文带你深入拆解 Java 虚拟机

推荐2:出场率比较高的一道多线程安全面试题

Java技术栈 • 长按关注

Java Base64 编码解码方案总结

本文分享自微信公众号 - Java技术栈(javastack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
2星期前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
Java base64编码解码工具类
前几天无意中看到Java中有Base64编码,不解的我去百科了一下,了解了Base64的基本使用和实现原理,于是在空暇时自己手动写了一个,这个类可以完成对字母数字的编码和解码工作,但是对于中文,还没有仔细研究其编码的实现过程。至于什么是Base64,用它来干什么,请移步到:http://zh.wikipedia.org/zhcn/Base64(http
Stella981 Stella981
2年前
JavaScript用btoa和atob来编码解码Base64
btoa和atob是window对象的两个函数,其中btoa是binarytoascii,用于将binary的数据用ascii码表示,即Base64的编码过程,而atob则是asciitobinary,用于将ascii码解析成binary数据,看一个例子://Definethestringvarstring'Hel
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
6个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这