在Java7及7之前,要实代Base64编码,要么借助sun.misc.BASE64Encoder,或者apache commons-codec,再或者Guava、JAXB的DatatypeConverter,到了Java8,官方已经把Base64进行了重新优化,并直接放到了java.util包里了。
实现起来,比之前的都要简单优雅,性能卓越,无需引用第三方包。
sun的Base64被广泛使用,但sun、com.sun开头的包并非是公开的,sun没有提供API文档,引用时也会被提醒warning,不包含在Java平台的标准中,实现还与操作系统或jdk的供应商有关,比如openJDK就没有自带com.sun或sun开头的包。
Oracle也发表了声明,从JDK 1.7开始,java程序员不能调用JDK系统包中以sun开头引入的类。
声明的链接:http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html
有人对sun、apache-codec、guava等多个Base64库进行了性能测试:sun的性能最差,java.util自带的Base64性能最好,java.util.Base64比sun有着近3倍性能的提升。功能方面,java.util.Base64还提供了对URL、MIME友好的编码器与解码器。
以下是Base64对字符串和文件流的编码和解码:
1.字符串的编码
String base64 = Base64.getEncoder().encodeToString("在Java 8中,Base64编码已经成为Java类库的标准。".getBytes("utf-8")); //以上可以将字符串转成Base64格式的串 |
---|
2.字符串解码
String str = new String(Base64.getDecoder().decode("SmF2YTggQmFzZTY0IEphdmEgOCDmlrDnibnmgKcg5ZyoSmF2YSA45LitLEJhc2U2NOe8lueggeW3sue7j+aIkOS4ukphdmHnsbvlupPnmoTmoIflh4bjgIIgSmF2YSA4IOWGhee9ruS6hiBCYXNlNjQg57yW56CB55qE57yW56CB5Zmo5ZKM6Kej56CB5Zmo44CCIEJhc2U2NOW3peWFt+exu+aPkOS+m+S6huS4gOWll+mdmeaAgS4uLg=="), "UTF-8"); //以上对Base64的串实现解码 |
---|
3. 文件实现Base64编码
File file = new File("C:\\Users\\Loufree\\Desktop\\1.png"); byte[] b = Files.readAllBytes(Paths.get(file.getAbsolutePath())); String base64Str = Base64.getEncoder().encodeToString(b); //使用了非阻塞的java.nio工具包,以上是将1.png图片转成base64编码 |
---|
4. Base64解码成文件
String str = "ZG9ja2VyIGVjbGlwc2Xmj5Lku7YNCuWQjeensO+8mmRvY2tlci1uaWdodGx5DQrlnLDlnYDvvJpodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvbGludXh0b29scy91cGRhdGVzLWRvY2tlci1uaWdodGx5Lw=="; Files.write(Paths.get("D:/create.txt"), Base64.getDecoder().decode(str), StandardOpenOption.CREATE); |
---|