這篇文章帶給大家的內容是介紹Java如何實作Base64編解碼?實作Base64編解碼4中方法 。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。
為什麼要用Base64編碼
在網路中傳輸資料都是使用ascii方式傳輸。對於一些圖片、影片等數據,可能就會被編碼成ascii中不可見部分的編碼。網路中不同的路由設備處理方式不同,有可能就會把這部分資料弄丟了。為了確保資料傳輸的正確性,可以使用Base64編碼將這些不可見資料編碼成可見資料。
Java實作Base64編解碼的幾種方法
方法一
#使用sun.misc套件中的BASE64Encoder和BASE64Decoder類別進行編解碼。這種方式比較古老,不建議使用。
程式碼如下:
/** * sun.misc方式Base64编码 * @param str * @return */ public static String encodeBySunMisc(String str) { try { return new BASE64Encoder().encode(str.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return ""; } } /** * sun.misc方式Base64解码 * @param str * @return */ public static String decodeBySunMisc(String str) { try { byte[] result = new BASE64Decoder().decodeBuffer(str); return new String(result); } catch (IOException e) { e.printStackTrace(); return ""; } }
sun.misc的Base64工具雖然在jdk中,但並不屬於標準函式庫,所以在Eclipse中無法直接使用。可以透過手動引入方式使用。
解決方法:
右鍵工程->Properties->Java Build Path->Libraries,點選Add External Jars,選擇%JAVA_HOME%\jre\lib\rt.jar即可。
方法二
使用Apache的commons-code套件。這種方式比sun.misc方式要稍快一些。
程式碼如下
/** * commons-code方式Base64编码 * @param str * @return */ public static String encodeByCommonsCode(String str) { byte[] result; try { result = org.apache.commons.codec.binary.Base64.encodeBase64(str.getBytes("UTF-8")); return new String(result); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return ""; } } /** * commons-code方式Base64解码 * @param str * @return */ public static String decodeByCommonsCode(String str) { byte[] result = org.apache.commons.codec.binary.Base64.decodeBase64(str.getBytes()); return new String(result); }
使用commons-code需要引入依賴。以gradle工程為例,需要在build.gradle中加入以下行:
implementation 'commons-codec:commons-codec:1.11'
#方法三
使用Apache的xerces工具。這個工具主要用於解析xml的,具有Base64編解碼功能。
程式碼如下:
/** * xerces方式Base64解码 * @param str * @return */ public static String decodeByXerces(String str) { try { byte[] result = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode(str); return new String(result); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * Java8中的Base64编码 * @param str * @return */ public static String encodeByJava8(String str) { try { return Base64.getEncoder().encodeToString(str.getBytes("UTF-8")); } catch (Exception e) { e.printStackTrace(); return ""; } }
方法四
Java8的util套件中已經自備Base64編解碼工具,而且效率非常高,建議使用這種方式。
程式碼如下:
/** * Java8中的Base64编码 * @param str * @return */ public static String encodeByJava8(String str) { try { return Base64.getEncoder().encodeToString(str.getBytes("UTF-8")); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * Java8中的Base64解码 * @param str * @return */ public static String decodeByJava8(String str) { byte[] result = Base64.getDecoder().decode(str.getBytes()); return new String(result); }
測試幾個編碼效果:
測試程式碼如下:
private static void testEncodeAndDecode(String src) { String encedeStr1 = encodeBySunMisc(src); System.out.println("encode by sun misc: " + encedeStr1); String decedeStr1 = decodeBySunMisc(encedeStr1); System.out.println("decode by sun misc: " + decedeStr1); String encedeStr2 = encodeByCommonsCode(src); System.out.println("encode by commons-code: " + encedeStr2); String decedeStr2 = decodeByCommonsCode(encedeStr2); System.out.println("decode by commons-code: " + decedeStr2); String encedeStr3 = encodeByXerces(src); System.out.println("encode by xerces: " + encedeStr3); String decodeStr3 = decodeByXerces(encedeStr3); System.out.println("decode by xerces: " + decodeStr3); String encedeStr4 = encodeByJava8(src); System.out.println("encode by java8: " + encedeStr4); String decedeStr4 = decodeByJava8(encedeStr4); System.out.println("decode by java8: " + decedeStr4); }
測試結果如下:
encode by sun misc: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by sun misc: abcdefghijklmnopqrst; encode by commons-code: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by commons-code: abcdefghijklmnopqrst; encode by xerces: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by xerces: abcdefghijklmnopqrst; encode by java8: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by java8: abcdefghijklmnopqrst;
比較一下幾種編解碼的效率。每種編碼方式使用20 個字元先進行編碼,再解碼,共執行100萬次,比較一下總的執行時間。
測試程式碼如下:
// 测试sun.misc编解码效率 private static void testSunMisc(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeBySunMisc(src + i); decodeBySunMisc(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("sun misc consume: " + (finish - begin) + "ms"); } // 测试commons-code编解码效率 private static void testCommonsCode(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeByCommonsCode(src + i); decodeByCommonsCode(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("commons-code consume: " + (finish - begin) + "ms"); } // 测试xerces编解码效率 private static void testXerces(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeByXerces(src + i); decodeByXerces(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("xerces consume: " + (finish - begin) + "ms"); } // 测试Java8编解码效率 private static void testJava8(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeByJava8(src + i); decodeByJava8(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("java 8 consume: " + (finish - begin) + "ms"); } public static void main(String[] args) { String src = "abcdefghijklmnopqrst;"; testSunMisc(src); testCommonsCode(src); testXerces(src); testJava8(src); }
總共測試3次,輸出結果如下:
commons-code consume: 3337ms sun misc consume: 6532ms xerces consume: 554ms java 8 consume: 547ms commons-code consume: 3148ms sun misc consume: 6445ms xerces consume: 498ms java 8 consume: 466ms commons-code consume: 3442ms sun misc consume: 6674ms xerces consume: 470ms java 8 consume: 512ms
#結論
古老的sun. misc方式效率最低,而xerces和Java8方式效率最高。由於Java8的便利性,建議直接使用Java8中自備的Base64工具進行編解碼。
以上是Java如何實作Base64編解碼?實作Base64編解碼4中方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!