Java 8 Base64 编码解码

10 篇文章 0 订阅

Java 8 Base64 编码解码

Base64 是一种常见的字符编码解码方式,一般用于将二进制数据编码为更具可读性的 Base64 进制格式。

Java 6 ( JDK 1.6 ) 之前, JDK 一直没有包含 Base64 的实现类。因此大部分人都使用 Sum/Orale JDK 里面的 sun.misc.BASE64Encodesun.misc.BASE64Decode。然后这也成为很多 Java 开发者的习惯。一直沿用到今天的 Java8 中还有人在用。

JDK 1.6虽然添加了 Base64 的实现。但是,非常隐秘,竟然是在 javax.xml.bind 包下的 DatastypeConvert 类中的两个静态方法 parseBase64BinaryprintBase64Binary.

Java 8终于把 Base64 扶正了,在 java.util 包下提供了 Base64 类用于编码和解码 Base64 数据。

Java 8 java.util.Base64

Java 8中的 java.util.Base64 类提供了三种类型的 Base64 编码解码格式:

1、 简单类型( simple ) : 编码字符只包含 A-Za-z0-9+/ 等 64 个字符。且编码的时候不会包含任何换行符 ( \r 、 \n 、\r\n )。解码的时候也只会解码 A-Za-z0-9+/ 内的字符,超出的则会被拒绝。
2、 URL : 编码字符只包含 A-Za-z0-9+_64 个字符。和 简单 相比,就是把 / 换成了_ 。因为没有 / 字符,因此这种编码方式非常适合 URL 和文件名等。
3、 MIME : 编码会被映射为 MIME 友好格式:每一行输出不超过 76 个字符,而且每行以 \r\n 符结束。但末尾行并不会包含 \r\n

内部类

java.util.Base64 还包含了两个内部静态类,分别实现了 RFC 4648RFC 2045 中规范的 Base64 编码和解码方式。

内部类说明
static class Base64.Decoder该类实现使用 RFC 4648 和 RFC 2045 中规定的 Base64 解码方案解码数据
static class Base64.Encoder该类实现使用 RFC 4648 和 RFC 2045 中规定的 Base64 编码方案编码数据

每个内部类的方法详情,请直接点击相关 URL 查看。

静态方法

java.util.Base64 类提供的都是静态方法。下表列出了这些静态方法

方法说明
Base64.Decoder getDecoder()返回一个 Base64.Decoder 类型的 简单 解码器
Base64.Encoder getEncoder()返回一个 Base64.Encoder 类型的 简单 编码器
Base64.Decoder getMimeDecoder()返回一个 Base64.Decoder 类型的 MIME 解码器
Base64.Encoder getMimeEncoder()返回一个 Base64.Encoder 类型的 MINE 编码器
Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)返回一个 Base64.Encoder 类型的使用特定长度和行分隔符的 MINE 编码器
Base64.Decoder getUrlDecoder()返回一个 Base64.Decoder 类型的 URL 和文件名安全的解码器
Base64.Encoder getUrlEncoder()返回一个 Base64.Encoder 类型的 URL 和文件名安全的编码器

范例一: 基本的编码解码器

我们写一个范例演示下 getDecoder()getEncoder() 两个方法

Base64Test编码解码

@Test
public void Base64Test() {
    try {
        String text = "Java 8 Base64 编码解码 - Java8新特性";
        String base64encodedString = Base64.getEncoder().encodeToString(text.getBytes("utf-8"));
        System.out.println(base64encodedString);
        byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
        System.out.println(new String(base64decodedBytes, "utf-8"));
    } catch (UnsupportedEncodingException e) {
        System.out.println("异常:" + e.getMessage());
    }
}
/*
执行结果:
	SmF2YSA4IEJhc2U2NCDnvJbnoIHop6PnoIEgLSBKYXZhOOaWsOeJueaApw==
	Java 8 Base64 编码解码 - Java8新特性
*/

范例二: URL 和文件名安全的编码解码器

我们写一个范例演示下 getUrlEncoder()getUrlDecoder() 两个方法

Base64Test编码解码

@Test
public void Base64Test() {
    try {
        String text = "Java 8 Base64 编码解码 - Java8新特性";
        String base64encodedString = Base64.getUrlEncoder().encodeToString(text.getBytes("utf-8"));
        System.out.println(base64encodedString);
        byte[] base64decodedBytes = Base64.getUrlDecoder().decode(base64encodedString);
        System.out.println(new String(base64decodedBytes, "utf-8"));
    } catch (UnsupportedEncodingException e) {
        System.out.println("异常:" + e.getMessage());
    }
}
/*
执行结果:
	SmF2YSA4IEJhc2U2NCDnvJbnoIHop6PnoIEgLSBKYXZhOOaWsOeJueaApw==
	Java 8 Base64 编码解码 - Java8新特性
*/

范例三:MIME Base64 编码解码器

我们写一个范例演示下 getMimeEncoder()getMimeDecoder() 两个方法

Base64Test编码解码

@Test
public void Base64Test() {
    try {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 5; ++i) {
            stringBuilder.append(UUID.randomUUID());
        }
        byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
        String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
        System.out.println(mimeEncodedString+"\n");
        byte[] base64decodedBytes = Base64.getMimeDecoder().decode(mimeEncodedString);
        System.out.println(new String(base64decodedBytes, "utf-8"));
    } catch (UnsupportedEncodingException e) {
        System.out.println("异常:" + e.getMessage());
    }
}
/*
执行结果:
	M2EzOWFhMTYtZWRkMS00ZDI2LTg2YTAtYmJhZWNkOTkwNWI2ZjA2MjE2NzgtYzdlZi00ODRhLTlh
    Y2ItZDdmM2M5ODVmMWY3NDg1Nzk4NzItZWM1OC00ZWEwLWE4ZjctYzIzMTFhN2Q1MDUzMzZhMzhj
    NmQtOWUzYy00NjBiLWE2MTQtYTE4YzQwMTYxYTliZmVlNzgxMDAtZjMzNi00ZmU4LTg0ZTYtZWFi
    MzIwODcyMzIy
    
    3a39aa16-edd1-4d26-86a0-bbaecd9905b6f0621678-c7ef-484a-9acb-d7f3c985f1f748579872-ec58-4ea0-a8f7-c2311a7d505336a38c6d-9e3c-460b-a614-a18c40161a9bfee78100-f336-4fe8-84e6-eab320872322

*/

是不是看不出来有 76 个字符分割 ? 没关系,我们使用另一个getMimeEncoder(int lineLength, byte[] lineSeparator) 重载方法试一下

Base64Test编码解码

@Test
public void Base64Test() {
    try {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 5; ++i) {
            stringBuilder.append(UUID.randomUUID().toString());
        }
        byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
        String mimeEncodedString = Base64.getMimeEncoder(32, "@~@\n\n".getBytes("utf-8")).encodeToString(mimeBytes);
        System.out.println(mimeEncodedString+"\n-----------分隔线--------------");
        byte[] base64decodedBytes = Base64.getMimeDecoder().decode(mimeEncodedString);
        System.out.println(new String(base64decodedBytes, "utf-8"));
    } catch (UnsupportedEncodingException e) {
        System.out.println("异常:" + e.getMessage());
    }
}
/*
执行结果:
	N2ViMjI3ODQtODUwMy00YmNhLWI5Njct@~@

    ZTEzZTY0MmEzYjc2YjM4ZmI4MDMtMDEw@~@

    Yi00NzE2LWE3MDgtNmRmMmM4NDkyN2Vl@~@

    M2IzNzA3MzEtNGQ3Yi00NmY3LThiOTMt@~@

    ZTc3OGJjMmExM2I5N2QyNDlmN2EtNzE4@~@

    Zi00ZDU4LWFmYzQtZTI3YjMwNzVkMWIz@~@

    MmFkOWZlZWItYWI5Yy00N2RlLWIyNzQt@~@

    MjI5YTY2N2QyYmMx
    -----------分隔线--------------
    7eb22784-8503-4bca-b967-e13e642a3b76b38fb803-010b-4716-a708-6df2c84927ee3b370731-4d7b-46f7-8b93-e778bc2a13b97d249f7a-718f-4d58-afc4-e27b3075d1b32ad9feeb-ab9c-47de-b274-229a667d2bc1
*/

在这个范例中,我们每隔 32 个字符就分割一次。且使用 @~@\n\n 作为分隔符。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaBase64编码解码在处理中文字符时可能会出现乱码的问题。这是因为Base64编码是将二进制数据进行转换成可打印的字符,而在进行Base64解码时,又会将字符转换回二进制数据。在这个过程中,如果编码解码使用的字符集不一致,就会导致出现乱码。 为了解决乱码问题,我们需要在编码解码时使用相同的字符集。在示例代码中,编码解码都使用了UTF-8字符集,这是一种广泛使用的字符集,可以正确地处理中文字符。 如果您在使用JavaBase64编码解码时遇到了乱码问题,可以检查以下几个方面: 1. 确保在编码解码时使用相同的字符集,如UTF-8。 2. 检查待编码的内容和待解码的字符串是否是使用相同的字符集进行转换的。 3. 如果编码解码涉及到文件,确保文件的编码格式正确。 通过以上的检查和确认,您应该能够正确地进行JavaBase64编码解码,避免出现乱码问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Base64编码解码,乱码](https://blog.csdn.net/luChenH/article/details/101058615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java实现BASE64编码解码的方法](https://download.csdn.net/download/weixin_38557980/12791130)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值