Java如何实现Base64编解码?实现Base64编解码4中方法

如果下载的源码需要作者授权,请更换源码。本站免费分享资源不会增加授权

本篇文章给大家带来的内容是介绍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%jrelibrt.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工具进行编解码。

本文由(壳先生)整理自网络,如转载请注明出处:https://www.mrshell.com;
本站发布的内容若侵犯到您的权益,请邮件联系 i@mrshell.com 删除,我们将及时处理!
===========================================================================

1. 本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2. 本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3. 不得使用于非法商业用途,商用请支持正版!不得违反国家法律,否则后果自负!
4. 若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

=================================================================

壳先生 » Java如何实现Base64编解码?实现Base64编解码4中方法

发表评论

提供最优质的资源集合

立即查看 了解详情