如何替代被遗弃的BASE64Encoder/BASE64Decoder
目录
一、问题
关键词:编译警告“警告: 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
更多推荐
所有评论(0)