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编码,用于处理常规的需求:输出的内容不添加换行符,而且输出的内容由字母加数字组成。下面是用法:

[java] view plain copy print?

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

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

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

[java] view plain copy print?

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

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

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

[java] view plain copy print?

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

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

[java] view plain copy print?

    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. // 编码器封装OutputStream, 文件/tmp/buff-base64.txt的内容是BASE64编码的形式
    5. try (OutputStream os = Base64.getEncoder().wrap(newFileOutputStream("/tmp/buff-base64.txt"))) {
    6. os.write(src.getBytes("utf-8"));
    7. }
    8. // 解码器封装InputStream, 以及以流的方式解码, 无需缓冲
    9. // is being consumed. There is no need to buffer the content of the file just for decoding it.
    10. try (InputStream is = Base64.getDecoder().wrap(newFileInputStream("/tmp/buff-base64.txt"))) {
    11. int len;
    12. byte[] bytes = new byte[100];
    13. while ((len = is.read(bytes)) != -1) {
    14. System.out.print(new String(bytes, 0, len, "utf-8"));
    15. }
    16. }
    17. }
时间: 2024-10-11 18:22:28

Java 8实现BASE64编解码的相关文章

Java实现BASE64编解码

Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目的是为了简化存储或传输.更详细地说,BASE64算法主要用于转换二进制数据为ASCII字符串格式.Java语言提供了一个很好的BASE64算法的实现,即Apache Commons Codec工具包.本文将简要地讲述如何使用BASE64以及它是如何工作的. 以下我们用BASE64对字符串进行编码:

Base64编解码Android和ios的例子,补充JNI中的例子

1.在Android中java层提供了工具类:android.util.Base64; 里面都是静态方法,方便直接使用: 使用方法如下: Java代码   // Base64 编码: byte [] encode = Base64.encode("Hello, World".getBytes(), Base64.DEFAULT); String enc = new String(encode); Log.d("","base 64 encode = &qu

Java8 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编码,用于处理常规的需求:输出的内容不添加换行符,而且输出的内容由字母加数字组成.下面是用法

openssl命令行Base64编解码

openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符openssl才能解码: 2,php需要对base64编码结果每隔64个字符插入一个换行符,openssl才能解码.(原因是openssl默认bufsize缓冲区大小16k,但是一旦涉及base64的计算缓冲区只有80字节,一旦编码结果超过80字节则会计算失败,base64编解码无法更改缓冲区大小) 示例代码

ios Base64编解码工具类及使用

为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可以用openssl来进行,但这东西相对来 说比较麻烦.google给提供了3个文件就够了. 官网地址是: http://code.google.com/p/google-toolbox-for-mac/ 这里面有很多宝贝,如果自己找很难找到这3个文件,所以我加到附件里.解压后放到ios工程中即可使用

Delphi 自带的 Base64 编解码函数

今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStream); // 编码procedure DecodeStream(Input, Output: TStream); // 解码 // 对字符串的编解码:function E

iOS开发网络篇之Base64编解码

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 在iPhone开发中很多时候都需要将数据进行Base64编解码. 在一些大项目中,就需要将通过R

BASE64编解码

由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位.这里的历史原因就在于第一封Email是由老美发出,当然字符编码也就只考虑美标ASCII码了.到后来,世界各地的人们都想使用便捷的“伊妹儿”,如果你发送了一封带有非 ASCII字符(即字节的最高位是1)的Email通过有历史问题的网关时就可能会出现问题.网关可能会把最高位置为0,这对于使用2字节或更多字节对文字进行编码的国家而言将不能实现正确的信息交流.为了能够使非美标ASCII编码的国家正常的传送Email,单单靠改变字

Java网络编程-对象编解码方案、优劣对比

书籍推荐:   实例代码 :http://download.csdn.net/detail/jiangtao_st/7677503  用户对象 /** * * <p> *用户实体对象定义 * </p> * * @author 卓轩 * @创建时间:2014年6月20日 * @产品: UIC * @version: V1.0 */ public class UserDO implements Serializable { private static final long seria