Java 8实现BASE64编解码

Java一直缺少BASE64编码 API,以至于通常在项目开发中会选用第三方的API实现。但是,Java 8实现了BASE64编解码API,它包含到java.util包。下面我会对Java 8的BASE64 API做一个介绍。

java.util.Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:

1)Basic编码
2)URL编码
3)MIME编码

Basic编码是标准的BASE64编码,用于处理常规的需求:输出的内容不添加换行符,而且输出的内容由字母加数字组成。下面是用法:

  1. // 编码  
  2. String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));  
  3. System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=  
  4.    
  5. // 解码  
  6. byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");  
  7. System.out.println(new String(asBytes, "utf-8")); // 输出为: some string  


与早期处理BASE64编码需求相比,不可能更简单了。因为无需外部依赖:commons-codec或sun.misc.BASE64Decoder或JAXB的DatatypeConverter。

URL编码也是我们经常会面对的需求,但由于URL对反斜线“/”有特殊的意义,因此URL编码需要替换掉它,使用下划线替换。比如下面的例子:

  1. String basicEncoded = Base64.getEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));  
  2. System.out.println("Using Basic Alphabet: " + basicEncoded);  
  3.    
  4. String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));  
  5. System.out.println("Using URL Alphabet: " + urlEncoded);  
  6. // 输出为:  
  7. Using Basic Alphabet: c3ViamVjdHM/YWJjZA==  
  8. Using URL Alphabet: c3ViamVjdHM_YWJjZA==  


上面的例子可以看出,如果是使用基本的编码器,那么输出可能会包含反斜线“/”字符,但是如果使用URL编码器,那么输出的内容对URL来说是安全的。

MIME编码器会使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束。比如下面的例子:

  1. StringBuilder sb = new StringBuilder();  
  2. for (int t = 0; t < 10; ++t) {  
  3.   sb.append(UUID.randomUUID().toString());  
  4. }  
  5.   
  6. byte[] toEncode = sb.toString().getBytes("utf-8");  
  7. String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);  
  8. System.out.println(mimeEncoded);  
  9. // 输出为:  
  10. NDU5ZTFkNDEtMDVlNy00MDFiLTk3YjgtMWRlMmRkMWEzMzc5YTJkZmEzY2YtM2Y2My00Y2Q4LTk5  
  11. ZmYtMTU1NzY0MWM5Zjk4ODA5ZjVjOGUtOGMxNi00ZmVjLTgyZjctNmVjYTU5MTAxZWUyNjQ1MjJj  
  12. NDMtYzA0MC00MjExLTk0NWMtYmFiZGRlNDk5OTZhMDMxZGE5ZTYtZWVhYS00OGFmLTlhMjgtMDM1  
  13. ZjAyY2QxNDUyOWZiMjI3NDctNmI3OC00YjgyLThiZGQtM2MyY2E3ZGNjYmIxOTQ1MDVkOGQtMzIz  
  14. Yi00MDg0LWE0ZmItYzkwMGEzNDUxZTIwOTllZTJiYjctMWI3MS00YmQzLTgyYjUtZGRmYmYxNDA4  
  15. Mjg3YTMxZjMxZmMtYTdmYy00YzMyLTkyNzktZTc2ZDc5ZWU4N2M5ZDU1NmQ4NWYtMDkwOC00YjIy  
  16. LWIwYWItMzJiYmZmM2M0OTBm  


java.util.Base64 类封装了所有的BASE64编码器和解码器,还支持流的封装——这是一个非常优雅的构造——包括编码和效率都很高(无需缓冲Buffer)——即编码器和 解码器的输入和输出无需缓冲Buffer。下面我们以一个例子来说明编码器是怎样封装FileOutputStream,以及解码器是怎样封装 FileInputStream的,两者皆不需要缓冲Buffer:

    1. public void wrapping() throws IOException {  
    2.   String src = "This is the content of any resource read from somewhere" +  
    3.     " into a stream. This can be text, image, video or any other stream.";  
    4.   
    5.   // 编码器封装OutputStream, 文件/tmp/buff-base64.txt的内容是BASE64编码的形式  
    6.   try (OutputStream os = Base64.getEncoder().wrap(newFileOutputStream("/tmp/buff-base64.txt"))) {  
    7.     os.write(src.getBytes("utf-8"));  
    8.   }  
    9.   
    10.   // 解码器封装InputStream, 以及以流的方式解码, 无需缓冲  
    11.   // is being consumed. There is no need to buffer the content of the file just for decoding it.  
    12.   try (InputStream is = Base64.getDecoder().wrap(newFileInputStream("/tmp/buff-base64.txt"))) {  
    13.     int len;  
    14.     byte[] bytes = new byte[100];  
    15.     while ((len = is.read(bytes)) != -1) {  
    16.       System.out.print(new String(bytes, 0, len, "utf-8"));  
    17.     }  
    18.   }  

转载于:https://www.cnblogs.com/deepbreath/p/5395078.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值