目录

 

一、问题

二、问题原由

三、问题的解决办法(使用新的替代类)

四、扩展


一、问题

关键词:编译警告“警告: BASE64Decoder是内部专用 API, 可能会在未来发行版中删除”或“警告: BASE64Encoder是内部专用 API, 可能会在未来发行版中删除

场景:在编码时,密码加密或二进制转换的时候,使用了sun.misc.BASE64Encoder编码或sun.misc.BASE64Decoder解码。

System.out.println("===============sun.misc.BASE64Encoder|sun.misc.BASE64Decoder=======================");
    //以前使用Base64编码/解码
    final BASE64Encoder encoder = new BASE64Encoder();
    final BASE64Decoder decoder = new BASE64Decoder();
    //编码
    String text = "字符串、Hello, word";
    String encoderText = encoder.encode(text.getBytes());
    System.out.println(encoderText);
    //解码
    try {
      byte[] bytes = decoder.decodeBuffer(encoderText);
      System.out.println(new String(bytes, "UTF-8"));
    } catch (IOException e) {
      e.printStackTrace();
    }

二、问题原由

使用了sun.misc包下的BASE64Encoder类或BASE64Decoder类。这两个类是sun公司的内部方法,并没有在java api中公开过,不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。java8及后面已经弃用了该类,java9已经移除并有新的替代类。

三、问题的解决办法(使用新的替代类)

  • 替代方案:下面给出框架中经常使用jar包中的替代类(实际其他jar中也有替代的类),而且这几种替代的类,可以互相解码彼此编码后的字符串。

1、第一种替代类:jdk1.8的java.util.Base64类

    System.out.println("================jdk1.8:java.util.Base64======================");
    //java8 使用
    Base64.Encoder encoder1 = Base64.getEncoder();
    Base64.Decoder decoder1 = Base64.getDecoder();
    //编码
    String text2 = "字符串、Hello world";
    String encodeValue2 = encoder1.encodeToString(text2.getBytes());
    System.out.println(encodeValue2);
    //解码
    byte[] decode2 = decoder1.decode(encodeValue2);
    try {
      System.out.println(new String(decode2, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

2、第二种替代类:Apache的commons-codec的org.apache.commons.codec.binary.Base64类

    System.out.println("================Apache:commons-codec:org.apache.commons.codec.binary.Base64======================");
    final org.apache.commons.codec.binary.Base64 base64 = new org.apache.commons.codec.binary.Base64();
    String text1 = "字符串、Hello, word";
    //编码
    byte[] bytes = base64.encode(text1.getBytes());
    System.out.println(bytes);
    String encodeValue = base64.encodeToString(text1.getBytes());
    System.out.println(encodeValue);
    //解码
    byte[] decode = base64.decode(encodeValue);
    try {
      System.out.println(new String(decode, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

3、第三种替代类:spring-core:org.springframework.util.Base64Utils类

    System.out.println("================spring-core:org.springframework.util.Base64Utils======================");
    String text4 = "字符串|Hello world";
    //编码
    String encodeValue4 = Base64Utils.encodeToString(text4.getBytes());
    System.out.println(encodeValue4);
    //解码
    byte[] bytes4 = Base64Utils.decodeFromString(encodeValue4);
    try {
      System.out.println(new String(bytes4, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

四、扩展

编码/解码替代的类,可以互相解码彼此编码后的字符串。实际上,他们底层的编码与加码的算法都是一样的,所以使用不用担心别人给你的是哪一种编码类生成字符串。

 

参考文献:
1、http://blog.sina.com.cn/s/blog_5a6efa330102v8st.html
2、https://www.cnblogs.com/alter888/p/9140732.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐