`
deepinmind
  • 浏览: 452212 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41679
社区版块
存档分类
最新评论

Java 8之base64

 
阅读更多

Java 8最终还是发布了。现在终于有了标准的方法来处理base64的编解码。很长时间以来我们都得依赖于Apache Commons Codec(当然它也是相当棒的)。比较在乎内存开销的开发人员通常会单独使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder,这样避免了加载额外的JAR包到应用程序里面,当然前提是他们确定他们用的一定就是SUN/Oracle的JDK。这些类在Java 8里依然存在。

这里写了个JUnit测试程序来演示下如何使用这几种API来进行base64编码:
  • Commons Codec: org.apache.commons.codec.binary.Base64
  • Java 8′s new java.util.Base64
  • The sort-of evergreen internal code of Sun/Oracle’s 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;
    
     @BeforeClass
     public static void setUp() throws Exception {
    
      //We want to test the APIs against the same data
      new Random().nextBytes(randomBinaryData);  
     }
    
     @Test
     public 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);
     } 
    
     @Test
     public 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);
     }
    
     @Test
     public void testCommonsBase64Encode() throws Exception {
    
      long before = System.currentTimeMillis();
    
      encodedCommons = Base64.encodeBase64(randomBinaryData);
    
      long after = System.currentTimeMillis();
      durationCommons = after-before;
      System.out.println("Commons: " + durationCommons);
     }
    
     @AfterClass
     public static void report() throws Exception {
    
      //Sanity check
      assertArrayEquals(encodedCommons, encodedJava8);
      System.out.println(durationCommons*1.0/durationJava8);
     }
    }
    
    


    这三种方式的性能到底如何呢?看起来base64只是个很小的方法,因为它把程序拖垮的可能性不大,不过你永远不知道底下到底藏着些什么。这里简单的测试了一下时间,从结果来看,这三种方式按从快到慢是这个顺序:Java 8, Commons, Sun。下面是测试的结果(对长度为5000000的字节数组进行编码):

    +Sun: 521
    +Commons: 160
    +Java8: 37

    Java 8的性能是Commons的四倍,是Sun的14倍。不过这个测试有点简单,你最好自己做下基准测试来得出你自己的结论。

    那么,到底该用哪种方式呢?专家们通常会这么说——这得分情况。如果确定你的代码是跑在Java 8及以上的版本,那么就用新的java.util.Base64吧。如果你需要支持多种不同的Jdk版本的话,最好是使用commons或者别的第三方库。或者就等老的版本的java不再使用了,你再重写你的代码。再或者就是,换一种编程语言来实现吧。

    注意:我甚至都没提到用sun.misc.BASE64Encoder。尽量别去用它。也许有一天某个版本的JDK就会删掉它。并且别的厂商发布的JDK里也没有这个类。

    原创文章转载请注明出处:http://it.deepinmind.com

    英文原文链接




    3
    0
    分享到:
    评论
    2 楼 foxsky 2014-04-06  
    谢谢,确实比自己写的速度快。
    1 楼 jahu 2014-04-06  
    Commons 做了重复操作,所以慢了,

    相关推荐

      java 文件转 Base64 工具类

      java 文件转 Base64 工具类 java 文件转 Base64 工具类java 文件转 Base64 工具类 java 文件转 Base64 工具类java 文件转 Base64 工具类 java 文件转 Base64 工具类java 文件转 Base64 工具类 java 文件转 Base64 ...

      java 图片base64 加密解密

      现代Java版本推荐使用Java 8引入的`java.util.Base64`类,它是标准API的一部分,更稳定且易于使用。例如: ```java import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; public ...

      java Base64工具类

      java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类 java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类 java Base64工具类 java Base64工具类java Base64工具类 java ...

      Java实现图片和Base64之间的相互转化

      在Java编程中,将图片与Base64编码进行相互转换是一项常见的任务,特别是在网络传输、存储和显示图像数据时。Base64是一种用于将任意二进制数据转换为可打印ASCII字符的编码方式,这对于在HTTP协议下传输二进制数据...

      java base64源码+jar包

      然而,描述中提到的是一个名为`BASE64Encoder.jar`的文件,这可能是一个早期的Java库,用于处理Base64编码和解码,可能在Java 8之前使用,因为它包含了`BASE64Encoder`和`BASE64Decoder`这两个类。 `BASE64Encoder`...

      java 把PDF转换成BASE64

      2. **转换为BASE64**:Java 8及以上版本提供了`java.util.Base64`工具类,可以方便地进行BASE64编码。 ```java String base64String = Base64.getEncoder().encodeToString(pdfBytes); ``` 至此,PDF文件已经被转换...

      java base64的jar包

      `javabase64-1.3.1.jar` 是一个包含Base64编码和解码功能的Java库,它提供了一些关键类和方法供开发者使用。例如,主要类`Base64`包含了编码和解码的方法,如`encodeBytes()`用于编码字节数组,`decode()`用于解码...

      java和js相互base64编码解码

      在Java 8及更高版本中,已经内置了`java.util.Base64`类来支持Base64编码和解码。例如,在`Base64EnOut.java`文件中,可能会包含以下代码: ```java import java.util.Base64; public class Base64EnOut { public...

      Java Base64编码和解码

      在IT领域,Base64是一种常见的...了解并熟练掌握Base64编码和解码是Java开发者必备的技能之一,尤其是在处理网络通信和数据存储时。通过Java提供的标准库,我们可以轻松地实现这一功能,同时确保数据的正确传输和解析。

      java Base64自定义码表

      在Java中,实现Base64编码和解码通常使用`java.util.Base64`类或Apache Commons Codec库中的`Base64`类。标准的Base64编码过程是将每3个字节的数据转换为4个6位的二进制数,然后将这些二进制数映射到编码表中的字符...

      java base64的mp3转base64的pcm

      java base64的MP3转base64的pcm工具类,适用于微信小程序的语音转文字,因为小程序的录音为MP3,大部分语音读写的第三方只支持wav和pcm,不用生成文件

      java实现base64加密

      在Java中,Base64的实现主要依赖于`java.util.Base64`类,这个类是在Java 8中引入的,提供了一系列的静态方法来完成Base64的编码和解码工作。下面我们将详细探讨如何在Java中实现Base64加密和解密: 1. **Base64...

      javabase64-1.3.1

      Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。... javabase64-1.3.1.rar String encoded = Base64.encode("Hello, world!", "UTF-8"); String decoded = Base64.decode(encoded, "UTF-8");

      java Base64工具类 java Base64工具类

      java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类java Base64工具类 java ...

      Java实现的Base64编码程序

      在Java中实现Base64编码,我们可以使用内置的`java.util.Base64`类,这个类提供了方便的方法来进行Base64的编码和解码。 Base64编码的原理是将每3个字节(24位)的数据分为4组,每组6位。由于ASCII码是7位的,因此6...

      javabase64-1.2.jar

      【标题】"javabase64-1.2.jar" 是一个Java库,主要用于实现Base64编码和解码功能。Base64是一种常见的数据编码方法,尤其在处理二进制数据时,如图片或证书,将其转换为ASCII文本格式以便在网络传输或存储时使用。这...

      java实现Base64加解密jar包

      BASE64Encoder.jar是用于java、android项目中Base64数据加解密工具,简单易用

      java-Base64编码

      5. **`javabase64-1.3.1.jar`**: 这是一个第三方库,可能是为了兼容旧版本的Java或者提供额外的功能。第三方库通常包含更丰富的API和功能,比如支持不同的编码风格,或者提供了线程安全的实现等。 6. **`README.txt...

      java使用base64加密

      Base64加密(编码)的过程是这样的:首先,输入的数据被分为每三个字节一组,因为每个字节有8位,三个字节共有24位。Base64将这24位转换为4个6位的块,每个6位块对应Base64字符集中的一位。如果原始数据不是3的倍数...

    Global site tag (gtag.js) - Google Analytics