base64编码的三种方式、各方式性能比较_base64decoder().decodebuffer-程序员宅基地

技术标签: java  base64  


转载链接:java 实现base64编码的三种方式、各方式性能比较、最后给出最优工具类 小白实操记录

转载内容:


简单介绍了base64编码,给出三种实现方式性能比较,可直接使用最后提供的工具类,性能比较不必细看,没营养。

 
1 base64编码
将字符串编码成[0-9a-zA-Z+/=]的格式,通过解码又可以换成成原有的样子,就是这么简单。

我爱编码!--> 5oiR54ix57yW56CB77yB---我爱编码

2 三种实现方式性能比较

package util.base64;
 
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import org.apache.commons.codec.binary.Base64;
 
/**
 *
 * base64编码实现的三种实现方式性能测试,推荐使用Java8提供的方法
 *
 */
public class BASE64EncoderTest {
 
    /**
     * 实际测试编码与解码速度的话,Java 8提供的Base64比Apache Commons Codec提供的还要快
     * ,Apache Commons Codec提供的比sun.misc提供的还要快。
     * 因此在Java上若要使用Base64,这个Java 8的java.util提供的Base64类是首选!
     *
     *
     *
     * @param args
     */
    public static void main(String[] args){
 
        sunMiscDemo();
        apacheCommonsCodecDemo();
        java8UtilDemo();
 
    }
 
    /**
     * 早期在Java上做Base64的编码与解码,会使用到JDK里sun.misc套件下的BASE64Encoder和
     * BASE64Decoder这两个类别,用法如下:
     *Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.
     * BASE64Encoder/BASE64Decoder类。
     * 这个类是sun公司的内部方法,并没有在java api中公开过,不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。
     * 但是在Eclipse和MyEclipse中直接使用,却找不到该类。解决方法如下:
     */
    public static void sunMiscDemo() {
        BASE64Encoder encoder = new BASE64Encoder();
        BASE64Decoder decoder = new BASE64Decoder();
        String str = "字串文字";
        String strEncoder = null;
        String strDecoder = null;
 
        Long startDate = new Date().getTime();
        for(int i = 0; i < 1000000; i++){
            //编码
            try {
                strEncoder = encoder.encode(str.getBytes("UTF-8"));
                //System.out.println("strEncoder=" + strEncoder);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
 
            //解码
            try {
                strDecoder = new String(decoder.decodeBuffer(strEncoder), "UTF-8");
                //System.out.println("strDecoder=" + strDecoder);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
 
 
 
        }
        Long endDate = new Date().getTime();
        System.out.println("SunMis test 100w次 加密解密耗时:" + (endDate - startDate));
    }
 
    /**
     * Apache Commons Codec有提供Base64的编码与解码功能,会使用到
     * org.apache.commons.codec.binary套件下的Base64类别
     */
    public static void apacheCommonsCodecDemo() {
        Base64 base64 = new Base64();
        String str = "字串文字";
        String strEncode = null;
        String strDecode = null;
 
            Long startDate = new Date().getTime();
            for(int i = 0; i < 1000000; i++){
                byte[] b = null;
                //编码
                try {
                    strEncode = new String(base64.encode(str.getBytes("UTF-8")), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                //解码
                try {
                    strDecode = new String(base64.decode(strEncode.getBytes("UTF-8")), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
 
 
        }
        Long endDate = new Date().getTime();
        System.out.println("ApacheCommons  test 100w次耗时:" + (endDate - startDate));
    }
 
    /**
     * Java 8之后的作法
     * Java 8的java.util套件中,新增了Base64的类别,可以用来处理Base64的编码与解码,用法如下:
     *
     */
    public static void java8UtilDemo() {
        java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();
        java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
        String str = "字串文字";
        String strEncoder = null;
        String strDecoder = null;
 
            Long startDate = new Date().getTime();
            for(int i = 0; i < 1000000; i++){
                //编码
                try {
                    strEncoder = encoder.encodeToString(str.getBytes("UTF-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                //解码
                try {
                    strDecoder = new String(decoder.decode(strEncoder), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            Long endDate = new Date().getTime();
            System.out.println("Java8 test 100w次耗时:" + (endDate - startDate));
 
          }
 
}


运行结果:

3 最优方式工具类 

package util.base64;
import java.util.Base64;
 
/**
 * base64 加密解密
 */
public class Base64UtilXb {
    public static void main(String[] args) {
        System.out.println(encrypt("我爱编码!"));
    }
     /**
     * BASE64加密
     */
    public static String encrypt(String str){
        if(str==null)return null;
        byte[] bytes = str.getBytes();
        //Base64 加密
        String encoded = Base64.getEncoder().encodeToString(bytes);
        System.out.println("Base 64 加密后:" + encoded);
        return encoded;
    }
 
    /**
     * BASE64解密
     * @throws Exception
     */
    public static String  decrypt(String key)  {
        if(key==null)return null;
        byte[] decoded = Base64.getDecoder().decode(key);
        String decodeStr = new String(decoded);
        System.out.println("Base 64 解密后:" + decodeStr);
        return decodeStr;
    }
 
}


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huqiwuhuiju/article/details/115860023

智能推荐

双碳目标下农田温室气体排放模拟实践技术应用_“双碳”背景下安徽省农业活动ch4排放估算-程序员宅基地

文章浏览阅读33次。农业是甲烷(CH4)、氧化亚氮(N2O)和二氧化碳(CO2)等温室气体的主要排放源,占全产业排放的13.5%。农田温室气体又以施肥产生的N2O和稻田生产产生的CH4为主,如何对农田温室气体进行有效模拟,不确定性较大。本次将从生命周期评价法(LCA)、经验模型和过程模型三个维度讲解农田温室气体排放的模拟,详细介绍甲烷(CH4)、氧化亚氮(N2O)和二氧化碳(CO2)的排放过程以及模拟技术,掌握农田温室气体排放的模拟技术。_“双碳”背景下安徽省农业活动ch4排放估算

Raptor求两正整数的最大公约数 递归算法_raptor递归-程序员宅基地

文章浏览阅读503次,点赞9次,收藏10次。大学计算思维实验课Raptor求两正整数的最大公约数 递归算法_raptor递归

hdu2187 老人是真饿了-程序员宅基地

文章浏览阅读1.1k次。悼念512汶川大地震遇难同胞——老人是真饿了Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16716 Accepted Submission(s): 7002Problem Description时间:2008年5月16日(震后第4..._hdu2187

慕课编译原理(第八章.扩充的巴科斯范式和语法图)_bnf范式概念在编译原理第几章-程序员宅基地

文章浏览阅读700次。慕课广西大学.编译原理.第八章.语法分析-自上而下分析2.扩充的巴科斯范式和语法图0 目录8 语法分析-自上而下分析28.2 扩充的巴科斯范式和语法图8.2.1课堂重点8.2.2测试与作业9 下一章0 目录8 语法分析-自上而下分析28.2 扩充的巴科斯范式和语法图8.2.1课堂重点8.2.2测试与作业9 下一章博客地址: ..._bnf范式概念在编译原理第几章

【(自动)运动控制系统】学习笔记_从电感矩阵方面说明非线性强耦合的根本原因-程序员宅基地

文章浏览阅读1w次,点赞17次,收藏69次。作者:MiTu_-_课程:运动控制系统参考书目:《自动控制系统》第二版 北京邮电大学 任彦硕 赵一丁运动控制系统一、课后习题二、直流调速三、变流调速四、简答一、课后习题U1 绪论自动控制系统结构七个环节:给定环节、放大环节、执行环节、控制对象、反馈环节、比较环节、校正环节自动控制系统举例(三选一):(一)速度给定控制系统  对 A 点列节点电流方程为:  某一时刻开始直流电动机转轴上负载转矩增加了一个恒定量,起始时,由于电动机输出功率还未来得及增大,转速将降低。使得测速发._从电感矩阵方面说明非线性强耦合的根本原因

报错: Could not build wheels for pillow, which is required to install pyproject.toml-based projects的解决_error: could not build wheels for pillow, which is-程序员宅基地

文章浏览阅读8.2k次,点赞6次,收藏4次。刚开始按报错的提示安装pillow==4.0.0版本的,就报上面的错误,上网上找解决方法,都未能解决,然后试着安装更高版本的pillow==10.0.0版本的,结果就成功了,我用的python版本是3.8的,估计是和python的版本与pillow版本里引用的库的兼容有关系,升级到相对应的版本就可以解决以上问题。以上供大家参考,讨论。_error: could not build wheels for pillow, which is required to install pypro

随便推点

c# 前导0_C#| 用前导和尾随空格/零填充整数-程序员宅基地

文章浏览阅读421次。c# 前导0To pad an integer number with leading and trailing spaces/zeroes, we can use String.Format() method which is library method of String class in C#. 要使用前导和尾随空格/零填充整数,我们可以使用String.Format()方法,该方法是C..._c#前导零

JavaScript运算符之三元运算符_js三元运算符-程序员宅基地

文章浏览阅读585次。三元运算符在程序开发时运用较多,他跟条件语句能同时实现某种效果时,三元运算符相对简单,代码量也相对较少,熟悉三元运算符是很有必要的;_js三元运算符

Window对象方法_window撖寡情 function-程序员宅基地

文章浏览阅读268次。Window 对象表示浏览器中打开的窗口。setTimeout() 方法功能:用于在指定的毫秒数后调用函数或计算表达式。语法:setTimeout(code/function, milliseconds)返回值:返回一个 ID(数字),可以将这个ID传递给 clearTimeout() 来取消执行。clearTimeout() 方法功能:可取消由 setTimeout() 方法设置的定时操作。语法:clearTimeout(id_of_settimeout)返回值:无_window撖寡情 function

贪心算法——找零钱、装豆子、分糖果、区间覆盖、霍夫曼编码等_找零钱贪心算法-程序员宅基地

文章浏览阅读708次。一、找零钱根据实际情况,有1元、(2元的已经不流通了)、5元、10元、20元、50元、100元。当有人给出36524元时,如何找钱给对方。// 找钱的类class payMoney{public: payMoney(); ~payMoney(); int howManyCash(int waitToPay);private: int *arr;};// 初始化钱的种类..._找零钱贪心算法

MVP模式研究与实践_前端 mvppersistent模式-程序员宅基地

文章浏览阅读450次。虽然有那么多资料介绍MVP了,但是还是想把自己的实践经验分享一下。MVP简介相信大家对MVC都是比较熟悉了,:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 从MVC和MVP两者结合来看,Controlller/Presenter..._前端 mvppersistent模式

VMware Vsphere 6.0安装部署 (三) vCenter Server安装-程序员宅基地

文章浏览阅读132次。安装准备环境需求:安装vcenter需要域环境,因此要先安装域控(有些功能比如horizon view需要用到域环境),学习环境可以用一台虚拟机做域控。建议将域控和vcenter服务器分别装在不同的服务器上,生产环境应该尽量在物理服务器上安装vcenter服务器,这里学习环境我们就在虚拟机上安装vcenter管理程序。安装vcenter需要最低2核CPU,8G内存本例中采用一..._使用命令行从vcenter 6.0或更高版本的服务器设备或外部平台服务控制器中收集支持

推荐文章

热门文章

相关标签