Base64解码编码方法——不建议使用sun.misc.BASE64Decoder
背景: 最近做了一个需求通过调用图片识别API分析用户提交的图片信息来提高运营人员的工作效率,其中有一步是调用阿里的图片识别API,但是此API的参数为图片的base64内容,而我就需要把一个有URL的图片转为base64提交,我先将图片下载用流缓到内存然后进行base64编码,但是因测试环境服务过多机子配置也不高,内存就爆了……
分析原因:
我在编码base64时使用的是sun包下面的sun.misc.BASE64Decoder类来进行编码,但是实际上在我们开发中现在要尽量避免使用sun包下面的类,实际上:
2SE中的类大致可以划分为以下的各个包:
java.,javax.,org.,sun.
除了“sun”包,其它各个包都是Java平台的标准实现,并且今后也将被继续支持。一般说来,“sun”之类的包并不包含在Java平台的标准中,它与操作系统相关,在不同的操作系统(如Solaris,Windows,Linux,Mac等等)中的实现也各不相同,并且可能随着J2SE版本不定期变化。因此,直接调用“sun”包的程序代码并不是100%的Java实现。也就是说:
“java.”包,“javax.”包,“org.”包是作为J2SE的API公开接口的一部分,如果程序直接调用这些包中的API,那么程序是可以运行在所有Java平台上,而与操作系统无关;但“sun.”包并不是API公开接口的一部分,调用“sun”包的程序并不能确保工作在所有Java平台上,事实上,这样的程序并不能工作在今后的Java平台上。
所以在我的程序使用sun.misc.BASE64Decoder服务器压力上去了以后很可能出现因为方法效率很差导致内存溢出的问题,得亏是在测试环境发现的,否则上线了以后则会引起巨大的问题~
推荐使用:
最后我则使用了java1.8的java.util.Base64类,或者也可以使用阿里的base64方法效率都很高。
吃一堑长一智,以后尽量避免使用sun包下内容,每次加载包时一定需要看好了再加,而不是能用就可以。