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里也沒有這個類。
原創文章轉載請注明出處:Java 8之base64