• 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工具进行编解码。

  • 相关阅读:
    DJANGO
    前端--BootStrap
    前端--JQuery
    前端--JavaScript
    前端--CSS
    前端--HTML
    python中面试题积累
    python中一些小的知识点
    python中字典的增删改查及相关知识点
    python中列表的增删改查以及其它相关方法
  • 原文地址:https://www.cnblogs.com/lasdaybg/p/9803988.html
Copyright © 2020-2023  润新知