Java 8之base64

jopen 11年前發布 | 105K 次閱讀 Java開發 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里也沒有這個類。

原創文章轉載請注明出處:Java 8之base64

英文原文鏈接

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!