介绍:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法;

1.使用场景:

Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换字符数据;然而直接转换是不行的,因为网络传输只能传输可打印字符;

什么是可打印字符?在ASCII码中规定,0-31、127这33个字符属于控制字符,32-126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其它字符呢?其中一种方式就是使用Base64

2.Base64编码分类

Basic编码,输出被映射到一组字符A-Za-z0-9+/,编码不添加任何航标,输出的解码仅支持A-Za-z0-9+/URL编码:输出映射到一组字符A-Za-z0-9+_,输出的是URL和文件MINE编码:使用Basic编码,输出映射到MIME(Multipurpose Internet Mail Extensions-多用途互联网邮件扩展类型)友好格式,输出每行不超过76个字符,并使用’\r\n’作为分隔符;

Basic编码将指定的数据转换为base64编码,其中会将问号转换为斜杠,如:“runoob?java8”中的问号转换为“/”;URL编码和Basic编码的不同之处是会将问号转换为下横杠,如:“runoob?java8”中的问号转换为“_”,主要用在url参数传递时的编码和解码;那MINE编码呢?它是基于Basic编码,但是会输出格式友好的数据;

示例可以参考:

https://www.runoob.com/java/java8-base64.html

3.自己封装的工具类

package com.sgrain.boot.common.utils.base64;

import com.sgrain.boot.common.enums.AppHttpStatus;

import com.sgrain.boot.common.exception.BusinessException;

import com.sgrain.boot.common.utils.CharsetUtils;

import com.sgrain.boot.common.utils.io.IOUtils;

import org.apache.commons.lang3.StringUtils;

import java.io.*;

import java.util.Base64;

/**

* 介绍:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法;

* 使用场景:Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换字符数据;

* 然而直接转换是不行的,因为网络传输只能传输可打印字符;

* 什么是可打印字符?在ASCII码中规定,0-31、127这33个字符属于控制字符,32-126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,

* 不在这个范围内的字符无法传输。那么该怎么才能传输其它字符呢?其中一种方式就是使用Base64

*

* @program: spring-parent

* @description: base64编码工具类

* @create: 2020/05/21

*/

public class Base64Utils {

/**

* Basic编码:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何航标,输出的解码仅支持A-Za-z0-9+/

* etc:runoob?java8 其中?可以转换为/

*

* @param encoderStr 字符串,默认UTF-8

* @return 编码后的字符串

*/

public static String encoder(String encoderStr) {

return encoder(encoderStr, CharsetUtils.UTF_8);

}

/**

* 字符串编码

* Basic编码:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何航标,输出的解码仅支持A-Za-z0-9+/

* etc:runoob?java8 其中?可以转换为/

*

* @param encoderStr 字符串

* @param charset 字符编码类型

* @return 编码后的字符串

*/

public static String encoder(String encoderStr, String charset) {

try {

if (StringUtils.isEmpty(encoderStr)) {

throw new BusinessException(AppHttpStatus.NULL_POINTER_EXCEPTION.getStatus(), "编码字符串不可以为空");

}

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

return Base64.getEncoder().encodeToString(encoderStr.getBytes(charset));

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* 字符串解码

* Basic编码:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何航标,输出的解码仅支持A-Za-z0-9+/

* etc:runoob?java8 其中?可以转换为/

*

* @param decoderStr 字符串

* @return 解码后的字符串

*/

public static String decoder(String decoderStr) {

return decoder(decoderStr, CharsetUtils.UTF_8);

}

/**

* 字符串解码

* Basic编码:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何航标,输出的解码仅支持A-Za-z0-9+/

* etc:runoob?java8 其中?可以转换为/

*

* @param decoderStr 字符串

* @param charset 编码方式

* @return 解码后的字符串

*/

public static String decoder(String decoderStr, String charset) {

try {

if (StringUtils.isEmpty(decoderStr)) {

throw new BusinessException(AppHttpStatus.NULL_POINTER_EXCEPTION.getStatus(), "解码字符串不可以为空");

}

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

return new String(Base64.getDecoder().decode(decoderStr), charset);

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* URL编码:输出映射到一组字符A-Za-z0-9+_,输出的是URL和文件

* etc:runoob?java8 其中?可以转换为_ ;对URL参数友好

*

* @param encoderStr 编码字符串,默认UTF-8

* @return 编码后的字符串

*/

public static String urlEncoder(String encoderStr) {

return urlEncoder(encoderStr, CharsetUtils.UTF_8);

}

/**

* URL编码:输出映射到一组字符A-Za-z0-9+_,输出的是URL和文件

* etc:runoob?java8 其中?可以转换为_ ;对URL参数友好

*

* @param encoderStr 编码字符串

* @param charset 编码方式

* @return 编码后的字符串

*/

public static String urlEncoder(String encoderStr, String charset) {

try {

if (StringUtils.isEmpty(encoderStr)) {

throw new BusinessException(AppHttpStatus.NULL_POINTER_EXCEPTION.getStatus(), "编码字符串不可以为空");

}

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

return Base64.getUrlEncoder().encodeToString(encoderStr.getBytes(charset));

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* URL解码:输出映射到一组字符A-Za-z0-9+_,输出的是URL和文件

* etc:runoob?java8 其中?可以转换为_ ;对URL参数友好

*

* @param decoderStr 解码字符串

* @return 解码后的字符串

*/

public static String urlDecoder(String decoderStr) {

return urlDecoder(decoderStr, CharsetUtils.UTF_8);

}

/**

* URL解码:输出映射到一组字符A-Za-z0-9+_,输出的是URL和文件

* etc:runoob?java8 其中?可以转换为_ ;对URL参数友好

*

* @param decoderStr 解码字符串

* @param charset 解码方式

* @return 解码后的字符串

*/

public static String urlDecoder(String decoderStr, String charset) {

try {

if (StringUtils.isEmpty(decoderStr)) {

throw new BusinessException(AppHttpStatus.NULL_POINTER_EXCEPTION.getStatus(), "解码字符串不可以为空");

}

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

return new String(Base64.getUrlDecoder().decode(decoderStr), charset);

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* MIME编码:输出映射到MIME(Multipurpose Internet Mail Extensions-多用途互联网邮件扩展类型)友好格式,输出每行不超过76个字符,并使用'\r\n'作为分隔符;

* 编码输出最后没有行分割

*

* @param encoderStr 编码字符串

* @return 编码后的字符串

*/

public static String mineEncoder(String encoderStr) {

return mineEncoder(encoderStr, CharsetUtils.UTF_8);

}

/**

* MIME编码:输出映射到MIME(Multipurpose Internet Mail Extensions-多用途互联网邮件扩展类型)友好格式,输出每行不超过76个字符,并使用'\r\n'作为分隔符;

* 编码输出最后没有行分割

*

* @param encoderStr 编码字符串

* @param charset 编码类型

* @return 编码后的字符串

*/

public static String mineEncoder(String encoderStr, String charset) {

try {

if (StringUtils.isEmpty(encoderStr)) {

throw new BusinessException(AppHttpStatus.NULL_POINTER_EXCEPTION.getStatus(), "编码字符串不可以为空");

}

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

return Base64.getMimeEncoder().encodeToString(encoderStr.getBytes(charset));

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* MIME编码:使用Base编码模式,输出映射到MIME(Multipurpose Internet Mail Extensions-多用途互联网邮件扩展类型)友好格式,输出每行不超过76个字符,并使用'\r\n'作为分隔符;

* 编码输出最后没有行分割

*

* @param decoderStr 解码字符串

* @return 解码后的字符串

*/

public static String mineDecoder(String decoderStr) {

return mineDecoder(decoderStr, CharsetUtils.UTF_8);

}

/**

* MIME编码:使用Base编码模式,输出映射到MIME(Multipurpose Internet Mail Extensions-多用途互联网邮件扩展类型)友好格式,输出每行不超过76个字符,并使用'\r\n'作为分隔符;

* 编码输出最后没有行分割

*

* @param decoderStr 解码字符串

* @param charset 字符编码

* @return 解码后的字符串

*/

public static String mineDecoder(String decoderStr, String charset) {

try {

if (StringUtils.isEmpty(decoderStr)) {

throw new BusinessException(AppHttpStatus.NULL_POINTER_EXCEPTION.getStatus(), "解码字符串不可以为空");

}

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

return new String(Base64.getMimeDecoder().decode(decoderStr), charset);

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* Base编码,将指定的字符串使用base64编码存入指定的文件

*

* @param filePath 指定文件路径

* @param encoderStr 编码字符串

* @param charset 字符编码

*/

public static void encoderWrap(String filePath, String encoderStr, String charset) {

try {

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

OutputStream os = Base64.getEncoder().wrap(new FileOutputStream(new File(filePath)));

IOUtils.write(encoderStr.getBytes(charset), os);

} catch (FileNotFoundException e) {

throw new BusinessException(AppHttpStatus.READ_RESOURSE_NOT_FOUND_EXCEPTION.getStatus(), StringUtils.join("指定路径", filePath, "的文件不存在," + e));

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* Base编码,将指定文件的内容解码为字符串

*

* @param filePath 指定文件路径

* @param charset 字符编码

* @return 解码后的字符串

*/

public static String decoderWrap(String filePath, String charset) {

try {

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

InputStream is = Base64.getDecoder().wrap(new FileInputStream(new File(filePath)));

return IOUtils.toString(is, charset);

} catch (FileNotFoundException e) {

throw new BusinessException(AppHttpStatus.READ_RESOURSE_NOT_FOUND_EXCEPTION.getStatus(), StringUtils.join("指定路径", filePath, "的文件不存在," + e));

}

}

/**

* URL编码,将指定的字符串使用base64编码存入指定的文件

*

* @param filePath 指定文件路径

* @param encoderStr 编码字符串

* @param charset 字符编码

*/

public static void urlEncoderWrap(String filePath, String encoderStr, String charset) {

try {

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

OutputStream os = Base64.getUrlEncoder().wrap(new FileOutputStream(new File(filePath)));

IOUtils.write(encoderStr.getBytes(charset), os);

} catch (FileNotFoundException e) {

throw new BusinessException(AppHttpStatus.READ_RESOURSE_NOT_FOUND_EXCEPTION.getStatus(), StringUtils.join("指定路径", filePath, "的文件不存在," + e));

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* URL编码,将指定文件的内容解码为字符串

*

* @param filePath 指定文件路径

* @param charset 字符编码

* @return 解码后的字符串

*/

public static String urlDecoderWrap(String filePath, String charset) {

try {

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

InputStream is = Base64.getUrlDecoder().wrap(new FileInputStream(new File(filePath)));

return IOUtils.toString(is, charset);

} catch (FileNotFoundException e) {

throw new BusinessException(AppHttpStatus.READ_RESOURSE_NOT_FOUND_EXCEPTION.getStatus(), StringUtils.join("指定路径", filePath, "的文件不存在," + e));

}

}

/**

* MINE编码,将指定的字符串使用base64编码存入指定的文件

*

* @param filePath 指定文件路径

* @param encoderStr 编码字符串

* @param charset 字符编码

*/

public static void mineEncoderWrap(String filePath, String encoderStr, String charset) {

try {

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

OutputStream os = Base64.getMimeEncoder().wrap(new FileOutputStream(new File(filePath)));

IOUtils.write(encoderStr.getBytes(charset), os);

} catch (FileNotFoundException e) {

throw new BusinessException(AppHttpStatus.READ_RESOURSE_NOT_FOUND_EXCEPTION.getStatus(), StringUtils.join("指定路径", filePath, "的文件不存在," + e));

} catch (UnsupportedEncodingException e) {

throw new BusinessException(AppHttpStatus.ENCODING_UNSUPPORTED_EXCEPTION);

}

}

/**

* MINE编码,将指定文件的内容解码为字符串

*

* @param filePath 指定文件路径

* @param charset 字符编码

* @return 解码后的字符串

*/

public static String mineDecoderWrap(String filePath, String charset) {

try {

if (StringUtils.isEmpty(charset)) {

charset = CharsetUtils.UTF_8;

}

InputStream is = Base64.getMimeDecoder().wrap(new FileInputStream(new File(filePath)));

return IOUtils.toString(is, charset);

} catch (FileNotFoundException e) {

throw new BusinessException(AppHttpStatus.READ_RESOURSE_NOT_FOUND_EXCEPTION.getStatus(), StringUtils.join("指定路径", filePath, "的文件不存在," + e));

}

}

}

GitHub地址:https://github.com/mingyang66/spring-parent/tree/master/doc/base