zoukankan      html  css  js  c++  java
  • Java实现Base64编解码

    为什么要用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%jrelib t.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实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/lasdaybg/p/9803988.html
Copyright © 2011-2022 走看看