Source From Here
Introduction
Base64 是一種能將任意 Binary 資料用64種字元組合成字串的方法,而這個 Binary 資料和字串資料彼此之間是可以互相轉換的,十分方便。在實際應用上,Base64 除了能將Binary資料可視化之外,也常用來表示字串加密過後的內容。如果要使用Java程式語言來實作Base64的編碼與解碼功能,可以參考本篇文章的作法。
Java 上的 Base64
早期作法
早期在 Java 上做 Base64 的編碼與解碼,會使用到 JDK 裡 sun.misc 套件下的 BASE64Encoder 和 BASE64Decoder 這兩個類別,用法如下:
從以上程式可以發現,在Java用Base64一點都不難,不用幾行程式碼就解決了!
只是這個 sun.misc 套件所提供的 Base64 功能,編碼和解碼的效率並不太好,而且在以後的 Java 版本可能就不被支援了,完全不建議使用。
Apache Commons Codec 作法
Apache Commons Codec 有提供 Base64 的編碼與解碼功能,會使用到 org.apache.commons.codec.binary 套件下的 Base64 類別,用法如下:
以上的程式碼看起來又比早期用 sun.misc 套件還要更精簡,效能實際執行起來也快了不少。缺點是需要引用 Apache Commons Codec,很麻煩。
Java 8 之後的作法
Java 8 的 java.util 套件中,新增了 Base64 的類別,可以用來處理 Base64 的編碼與解碼,用法如下:
與 sun.misc 套件和 Apache Commons Codec 所提供的 Base64 編解碼器來比較的話,Java 8 提供的 Base64 擁有更好的效能。實際測試編碼與解碼速度的話,Java 8 提供的Base64,要比sun.misc套件提供的還要快至少11倍,比 Apache Commons Codec 提供的還要快至少3倍。因此在 Java 上若要使用 Base64,這個 Java 8 底下的 java.util 套件所提供的 Base64 類別絕對是首選!
Performance Testing
底下代碼使用上面三種方法測試並列印出所需時間 (encode+decode):
不同電腦執行結果可能不同, 在我的筆電上執行速度 JDK8 API > Apache Common Codec > Sun API:
Introduction
Base64 是一種能將任意 Binary 資料用64種字元組合成字串的方法,而這個 Binary 資料和字串資料彼此之間是可以互相轉換的,十分方便。在實際應用上,Base64 除了能將Binary資料可視化之外,也常用來表示字串加密過後的內容。如果要使用Java程式語言來實作Base64的編碼與解碼功能,可以參考本篇文章的作法。
Java 上的 Base64
早期作法
早期在 Java 上做 Base64 的編碼與解碼,會使用到 JDK 裡 sun.misc 套件下的 BASE64Encoder 和 BASE64Decoder 這兩個類別,用法如下:
- final BASE64Encoder encoder = new BASE64Encoder();
- final BASE64Decoder decoder = new BASE64Decoder();
- final String text = "字串文字";
- final byte[] textByte = text.getBytes("UTF-8");
- //編碼
- final String encodedText = encoder.encode(textByte);
- System.out.println(encodedText);
- //解碼
- System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));
Apache Commons Codec 作法
Apache Commons Codec 有提供 Base64 的編碼與解碼功能,會使用到 org.apache.commons.codec.binary 套件下的 Base64 類別,用法如下:
- final Base64 base64 = new Base64();
- final String text = "字串文字";
- final byte[] textByte = text.getBytes("UTF-8");
- //編碼
- final String encodedText = base64.encodeToString(textByte);
- System.out.println(encodedText);
- //解碼
- System.out.println(new String(base64.decode(encodedText), "UTF-8"));
Java 8 之後的作法
Java 8 的 java.util 套件中,新增了 Base64 的類別,可以用來處理 Base64 的編碼與解碼,用法如下:
- final Base64.Decoder decoder = Base64.getDecoder();
- final Base64.Encoder encoder = Base64.getEncoder();
- final String text = "字串文字";
- final byte[] textByte = text.getBytes("UTF-8");
- //編碼
- final String encodedText = encoder.encodeToString(textByte);
- System.out.println(encodedText);
- //解碼
- System.out.println(new String(decoder.decode(encodedText), "UTF-8"));
Performance Testing
底下代碼使用上面三種方法測試並列印出所需時間 (encode+decode):
- package test;
- import java.util.Random;
- import org.apache.commons.codec.binary.Base64;
- import sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- import flib.util.TimeStr;
- public class Base64Test {
- public static void SunAPI(String text) throws Exception
- {
- long st = System.currentTimeMillis();
- final BASE64Encoder encoder = new BASE64Encoder();
- final BASE64Decoder decoder = new BASE64Decoder();
- final byte[] textByte = text.getBytes("UTF-8");
- //編碼
- final String encodedText = encoder.encode(textByte);
- //System.out.println(encodedText);
- //解碼
- String decodeStr = new String(decoder.decodeBuffer(encodedText), "UTF-8");
- System.out.printf("SunAPI takes %s\n", TimeStr.toStringFrom(st));
- }
- public static void ApacheCode(String text) throws Exception
- {
- long st = System.currentTimeMillis();
- final Base64 base64 = new Base64();
- final byte[] textByte = text.getBytes("UTF-8");
- //編碼
- final String encodedText = base64.encodeToString(textByte);
- //System.out.println(encodedText);
- //解碼
- String decodeStr = new String(base64.decode(encodedText), "UTF-8");
- System.out.printf("Apache Common Codec takes %s\n", TimeStr.toStringFrom(st));
- }
- public static void JDK8Native(String text) throws Exception
- {
- long st = System.currentTimeMillis();
- final java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
- final java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();
- final byte[] textByte = text.getBytes("UTF-8");
- //編碼
- final String encodedText = encoder.encodeToString(textByte);
- //解碼
- String decodeStr = new String(decoder.decode(encodedText), "UTF-8");
- System.out.printf("JDK8 Native API takes %s\n", TimeStr.toStringFrom(st));
- }
- public static void main(String args[]) throws Exception
- {
- // Generate testing string
- StringBuffer strBuf = new StringBuffer();
- String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
- Random rdm = new Random();
- for(int i=0; i<100000; i++)
- {
- int r = rdm.nextInt(chars.length());
- strBuf.append(chars.substring(r, r+1));
- }
- SunAPI(strBuf.toString());
- ApacheCode(strBuf.toString());
- JDK8Native(strBuf.toString());
- }
- }
沒有留言:
張貼留言