在Java 8中,Base64编码已经成为Java类库的标准。
java.util.Base64类:
Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:
基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。(getEncoder,getDecoder)
URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。(getUrlEncoder,getUrlDecoder)
MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用'\r'并跟随'\n'作为分割。编码输出最后没有行分割。(getMimeEncoder,getMimeDecoder)
内嵌类
static class Base64.Decoder
该类实现一个解码器用于,使用 Base64 编码来解码字节数据。
static class Base64.Encoder
该类实现一个编码器,使用 Base64 编码来编码字节数据。
方法
static Base64.Decoder getDecoder()
返回一个 Base64.Decoder ,解码使用基本型 base64 编码方案。
static Base64.Encoder getEncoder()
返回一个 Base64.Encoder ,编码使用基本型 base64 编码方案。
static Base64.Decoder getMimeDecoder()
返回一个 Base64.Decoder ,解码使用 MIME 型 base64 编码方案。
static Base64.Encoder getMimeEncoder()
返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案。
static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)
返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案,可以通过参数指定每行的长度及行的分隔符。
static Base64.Decoder getUrlDecoder()
返回一个 Base64.Decoder ,解码使用 URL 和文件名安全型 base64 编码方案。
static Base64.Encoder getUrlEncoder()
返回一个 Base64.Encoder ,编码使用 URL 和文件名安全型 base64 编码方案。
java8中的Base64可以支持流。
EncOutputStream和DecInputStream这两个内部类就是当作用于对流的支持,
在 Base64.Encoder和Base64.Decoder 中使用wrap这个包装函数就是返回创建这两个类变返回。
使用:
package com.imddy.sms.util;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.UUID;
import javax.xml.bind.DatatypeConverter;
public class Jdk8Base64 {
public static void main(String[] args) throws Exception {
// String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
// System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=
try {
// 使用基本编码
String base64encodedString = Base64.getEncoder().encodeToString("runoob?java8".getBytes("utf-8"));
System.out.println("Base64 比那么字符串 (基本) :" + base64encodedString);
// 解码
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println("原始字符串: " + new String(base64decodedBytes, "utf-8"));
base64encodedString = Base64.getUrlEncoder().encodeToString("TutorialsPoint?java8".getBytes("utf-8"));
System.out.println("Base64 编码字符串 (URL) :" + base64encodedString);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);
}catch(UnsupportedEncodingException e){
System.out.println("Error :" + e.getMessage());
}
}
}
Base64对流的操作:
public void wrapping() throws IOException {
String src = "This is the content of any resource read from somewhere" +
" into a stream. This can be text, image, video or any other stream.";
// 编码器封装OutputStream, 文件/tmp/buff-base64.txt的内容是BASE64编码的形式
try (OutputStream os = Base64.getEncoder().wrap(newFileOutputStream("/tmp/buff-base64.txt"))) {
os.write(src.getBytes("utf-8"));
}
// 解码器封装InputStream, 以及以流的方式解码, 无需缓冲
// is being consumed. There is no need to buffer the content of the file just for decoding it.
try (InputStream is = Base64.getDecoder().wrap(newFileInputStream("/tmp/buff-base64.txt"))) {
int len;
byte[] bytes = new byte[100];
while ((len = is.read(bytes)) != -1) {
System.out.print(new String(bytes, 0, len, "utf-8"));
}
}
}