Java 6环境下替换sun.misc.Base64为DatatypeConverter报错如何解决
直接修复方案
你代码报错是因为DatatypeConverter的printBase64Binary是静态方法,不需要通过new实例化调用。原有代码加new是因为sun.misc.BASE64Encoder是普通类,必须实例化才能调用方法,二者的实现差异不会影响业务逻辑,直接删除new关键字即可。
修改后的正确代码如下:
try { byte[] utf8 = textToEncrypt.getBytes("UTF8"); byte[] enc = encryptionCypher.doFinal(utf8); //return new sun.misc.BASE64Encoder().encode(enc); return DatatypeConverter.printBase64Binary(enc); } catch (javax.crypto.BadPaddingException e) { throw new EncryptException(e.toString(), e); } catch (IllegalBlockSizeException e) { throw new EncryptException(e.toString(), e); } catch (UnsupportedEncodingException e) { throw new EncryptException(e.toString(), e); }
Netbeans操作提示
修改后按Alt + Shift + I快捷键即可自动导入javax.xml.bind.DatatypeConverter类,无需手动编写导包语句。
兼容性验证
DatatypeConverter.printBase64Binary的输出规则和sun.misc.BASE64Encoder完全一致,无换行、填充符差异,你可以用同一组测试字节数组分别用两个实现编码,对比输出结果完全相同,不会产生兼容性问题。
如果项目中还有BASE64解码的逻辑,同理替换即可:
原有解码代码:new sun.misc.BASE64Decoder().decodeBuffer(base64Str)
替换为:DatatypeConverter.parseBase64Binary(base64Str)
可选替代方案
如果后续有跨更高Java版本运行的需求(Java 9及以上版本默认移除了javax.xml.bind模块),可以选择引入Apache Commons Codec工具包,最后一个兼容Java 6的版本为1.11,使用方法如下:
- 引入commons-codec 1.11依赖
- 替换编码代码为:
import org.apache.commons.codec.binary.Base64; // 替换原有return行即可 return Base64.encodeBase64String(enc);
该实现和原有sun.misc.BASE64Encoder输出结果完全兼容,且不受JDK版本升级影响,稳定性更高。
内容的提问来源于stack exchange,提问作者Caleb Board

