Java 8中的Base64 –加入乐趣为时不晚

最后,Java 8发布了。 最后,有一种执行Base64编码的标准方法。 长期以来,我们一直依赖于Apache Commons Codec(无论如何还是很棒的)。 内存敏感的编码人员将拼命使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder,以避免在其程序中添加额外的JAR文件,前提是他们确信仅使用Sun / Oracle JDK。 这些类仍在Java 8中潜伏。

为了进行试验,我提供了一个JUnit测试,以显示如何使用以下API进行编码:

  • 公用编解码器:org.apache.commons.codec.binary.Base64
  • Java 8的新java.util.Base64
  • Sun / Oracle JDK的常绿内部代码:sun.misc.BASE64Encoder
package org.gizmo.util;import java.util.Random;import org.apache.commons.codec.binary.Base64;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;import sun.misc.BASE64Encoder;public class Base64Tests {private static byte[] randomBinaryData = new byte[5000000];private static long durationCommons = 0;private static long durationJava8 = 0;private static long durationSun = 0;private static byte[] encodedCommons;private static byte[] encodedJava8;private static String encodedSun;@BeforeClasspublic static void setUp() throws Exception {//We want to test the APIs against the same datanew Random().nextBytes(randomBinaryData);  }@Testpublic void testSunBase64Encode() throws Exception {BASE64Encoder encoder = new BASE64Encoder();long before = System.currentTimeMillis();encodedSun = encoder.encode(randomBinaryData);long after = System.currentTimeMillis();durationSun = after-before;System.out.println("Sun: " + durationSun);} @Testpublic void testJava8Base64Encode() throws Exception {long before = System.currentTimeMillis();java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();encodedJava8 = encoder.encode(randomBinaryData);long after = System.currentTimeMillis();durationJava8 = after-before;System.out.println("Java8: " + durationJava8);}@Testpublic void testCommonsBase64Encode() throws Exception {long before = System.currentTimeMillis();encodedCommons = Base64.encodeBase64(randomBinaryData);long after = System.currentTimeMillis();durationCommons = after-before;System.out.println("Commons: " + durationCommons);}@AfterClasspublic static void report() throws Exception {//Sanity checkassertArrayEquals(encodedCommons, encodedJava8);System.out.println(durationCommons*1.0/durationJava8);}
}

这三种方式的性能如何? Base64似乎是一个很小的方法,因此拧紧它的方法很少,但是您永远不会知道表面之下的内容。 从一般的时间安排(在JUnit测试中)看来,可以将3种方法排列成这样,从最快到最慢:Java 8,Commons,Sun。 时间示例(编码大小为5,000,000的字节数组):

太阳:521

公地:160

Java8:37

Java 8的方法运行速度比Commons快4倍,比Sun快14倍。 但是此示例只是简单化。 一定要为自己建立基准,以得出自己的结论。

那么,要使用哪些API? 正如任何专家都会告诉您的那样……要视情况而定。 如果您有足够的能力指示您的代码只能在Java 8及更高版本上运行,则请务必使用新的java.util.Base64。 如果您只需要支持多个JDK版本和供应商,则可以使用Commons Codec或其他一些第三方API。 或者等到较旧的Java不再发行或使用后,再重写您宝贵的代码库。 或继续使用另一种编程语言。

注意:我什至没有提到使用sun.misc.BASE64Encoder。 尽可能避免使用它。 也许有一天,该类将在另一个(alos)JDK版本中删除……其他供应商在其他(heteros)JDK中不提供该类。

资源资源

  • http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
  • http://stackoverflow.com/questions/13109588/base64-encoding-in-java/22704819#22704819
  • http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html

翻译自: https://www.javacodegeeks.com/2014/04/base64-in-java-8-its-not-too-late-to-join-in-the-fun.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多层架构模型中的BLL 与 Model的解释

理想状态这两个可以合并到一起来,就是业务对象,但model是把这个业务对象中的数据提取了出来,作为一个数据载体,可以在层间传递。业务对象中除去这些数据剩下的方法就构成了BLL层。显示层Presentation Layer业务逻辑层Business Log…

java创建方法并引用_java – 创建非捕获方法引用,它将调用超类方法

我正在尝试重构以下代码&#xff1a;class Base {private Object a, b, <...>; // theres like 10 of these attributes of different typepublic Object a() {return a;}public Object b() {return b;}// more getters like the ones above}class RootNode extends Base…

maven快速入门

一。前提条件 你的电脑必须安装maven和java 二。检验安装 执行命令&#xff1a;mvn --version 输出&#xff1a; Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T20:41:4702:00) Maven home: D:\apache-maven-3.6.0\bin\.. Java version: 1.8.0_16…

如何使用JSR107缓存注释

最近&#xff0c;我对JSR107缓存注释以及JSR107的实现是否提供它们有一些疑问。 可以将缓存注释添加到Java类中&#xff0c;并将其作为方法调用缓存操作。 例如&#xff0c;下面是带注释的BlogManager。 CacheDefaults(cacheName "blgMngr") public class BlogMan…

js之作用域

1.什么是作用域 作用域是用于收集存储维护变量&#xff0c;以及当前执行代码声明的变量所拥有的权限&#xff0c; 例如 &#xff1a; function foo(a){ console.log(a); -------- 1 }; foo(666); console.log(a); ------- 2 此时执行该段代码 1 -- 处打印我们得…

TMS320F28335——IO控制/定时计操作

一、实现GPIO控制 1.硬件连接 从电路原理图上看来&#xff0c;LED灯是接在GPIO34 上的。 2.IO设置 2.1设置功能 GPXMUX1/2&#xff1a;功能选择寄存器   GPXMUX1/2 每组 IO 一般有 32 个 IO 口可以配置。GPXMUX1 对应每组的低 16 个 IO 口&#xff0c;GPXMUX2 对应高 16 个…

网页弹出窗口代码【来源于网络】

网页弹出窗口代码 1、最基本的弹出窗口代码 其实代码非常简单&#xff1a; < SCRIPT LANGUAGE"java script"> < !-- window.open ("page.html") --> < /SCRIPT> 因为这是一段java script代码&#xff0c;所以它们应该放在< SCRIPT L…

比Python、Java更快的 Go 语言,能否称霸江湖?

关注之后加星标&#xff0c;江湖要事早知道 ​ 文章来源&#xff1a;jb51.net 有一种语言堪称比语言排行榜前五热门选手的Python、Java更快&#xff0c;它就是GO语言。 Go于2009年11月正式宣布推出&#xff0c;成为开放源代码项目&#xff0c;并在Linux及Mac OS X平台上进行了实…

嗨,您好 。 。 ! 您如何评价Java / Java EE技能?

要知道&#xff0c;就是要知道你一无所知。 那就是真正知识的含义。 苏格拉底 这篇文章旨在为读者提供Java生态系统及其技术堆栈的快速概述。 老实说&#xff0c;从Java EE 7&#xff0c;Java SE 8到Java Embedded 8…&#xff0c;Java平台进行了许多革命性的更改和添加。 哇…

simulinkveristandlabview联合仿真——模型导入搭建人机界面

目录 1.软件版本 2.搭建simulink仿真模型 编译错误 3.导入veristand并建立工程 4.veristand导入labview labview显示veristand工程数据 labview设置veristand工程数据 运行labview工程 1.软件版本 matlab2020a&#xff0c;veristand2020 R4&#xff0c;labview2020 SP…

jquery appendTo用法

$("#top_cartWarp").appendTo($("#top_main_right")).css(position,relative).css(top,0px); 返回值:jQueryappendTo(content) V1.0概述 把所有匹配的元素追加到另一个指定的元素元素集合中。 实际上&#xff0c;使用这个方法是颠倒了常规的$(A).append(B)…

Java程序员的典型工作过程有哪些_Java程序员都要经历哪些阶段

原标题&#xff1a;Java程序员都要经历哪些阶段程序员从菜鸟到优秀的过程是需要时间&#xff0c;经验&#xff0c;不断的进阶&#xff0c;小编和大家一起看看每个阶段都要经历哪些成长阵痛&#xff1a;没有防卫这个阶段很快就会过去&#xff0c;因为有无数的书本和”前辈”在提…

关于DataFormWebPart中CreatedModifiedInfo信息的分开使用

以下是问题的描述,我先从数据说起.数据存储在一个叫pages的自定义列表中,该列表除默认的栏外,另增加了一栏"Abstract",为多行文本,用于存储文章摘要信息.当该列表中录入数据后如图: 这时,当我们点列表项如"page2"时,会进入该项的 DispForm.aspx页面.如图:这…

Day47 Django基础部分、路由配置、空间名称

1.最简单的路由配置 URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表&#xff1b;你就是以这种方式告诉Django&#xff0c;对于客户端发来的某个URL调用哪一段逻辑代码对应执行。 1.1 例1&#xff1a; 第一步&#xff1a;在…

6-3 向二分搜索树中添加元素 6-4 改进添加操作:深入理解递归终止条件

二分搜索树添加新元素60, 60>41(根节点)&#xff0c;所以一定要插入到41的右子树。 接着在和58比较 1 public class BST<E extends Comparable<E>> {//对于二分搜索树所存储的内容支持泛型&#xff0c;所以在这里写一个E&#xff0c;此外二分搜索树不是支持所有…

ClassNotFoundException:是否减慢了您的JVM?

大多数Java开发人员都熟悉臭名昭著且非常常见的java.lang.ClassNotFoundException 。 虽然通常已经很好地了解了此问题的根源&#xff08;类路径中缺少类/库&#xff0c;类加载器委派问题等&#xff09;&#xff0c;但对整体JVM和性能的影响通常是未知的。 这种情况可能会对您的…

jQuery 遍历 each()方法

输出每个 li 元素的文本&#xff1a; $("button").click(function(){$("li").each(function(){alert($(this).text())});});亲自试一试 定义和用法 each() 方法规定为每个匹配元素规定运行的函数。 提示&#xff1a;返回 false 可用于及早停止循环。 语法…

java服务器端测试_java-在服务器端测试Spring Web Services端点?

我正在使用Spring WS 2.0.我已经看到了端点和测试用例以测试端点.Endpointpublic class CustomerEndpoint {ResponsePayloadpublic CustomerCountResponse getCustomerCount(RequestPayload CustomerCountRequest request) {CustomerCountResponse response new CustomerCount…

CSS样式表的规划与组织

如果你的工作过程中遇到以下问题&#xff0c;那么请你阅读此文章。 1&#xff1a;样式表文件里面的代码混乱&#xff0c;随着项目的进展&#xff0c;样式表里面的先有代码不敢做任何改变&#xff0c;因为连自己也不知道改了以后会给现有项目造成什么影响。更不敢删除。因为连自…

【链接】Linux C/C++ 学习路线-已拿腾讯、百度 offer

https://www.nowcoder.com/discuss/203082?type0&order0&pos69&page1 https://www.nowcoder.com/discuss/193598 https://www.nowcoder.com/discuss/164781 https://www.nowcoder.com/discuss/188367 https://www.nowcoder.com/discuss/188367 已经有两年C经验的话…