一、base64是什么
base64是一种编码方式,可以基于64个可打印字符来表示二进制数据 ,也就是可以把二进制数据转换成字符串形式来表示,Base64编码是从二进制到字符的过程 。
在计算机中所有类型的数据最终都会以二进制的形式来表示,而base64可以把二进制数据转换成字符串。
二、java中base64编码的使用
在java中,不管是一个文件,一张图片,利用流读取到内存中后都会以字节数组的形式来表示,字符串也可以转换成字节数组
java中提供了一个 java.util.Base64
工具类可以用来进行base64的编码和解码
要明确的是,base64是对字节进行操作,所以操作后的结果还是一个字节,只不过这时变成了可打印字符
2.1对字符串进行base64编码和解码
编码:
public static void main(String[] args) {
String str="Hello world";
Base64.Encoder encoder = Base64.getEncoder();
//将字符串转成字节数组进行base64编码得到一个新的字节数组,这个数组可以转成可打印字符
byte[] encodeByteArr = encoder.encode(str.getBytes(StandardCharsets.UTF_8));
//把新得到的字节数组再转成字符串形式(可打印字符),这样就得到了原始字符串的base64编码形式
String encodeStr= new String(encodeByteArr,StandardCharsets.UTF_8);
System.out.println(encodeStr);
}
上边最终输出的结果是SGVsbG8gd29ybGQ=
,这就是str进行base64编码后的字符串表示形式
解码:
public static void main(String[] args) {
String decodeStr="SGVsbG8gd29ybGQ=";
Base64.Decoder decoder = Base64.getDecoder();
// 解码也是针对字节数组来解码的,解码后仍是一个字节数组,这个字节数组就不一定是可打印字符了
byte[] decodeBytes = decoder.decode(decodeStr.getBytes(StandardCharsets.UTF_8));
String res = new String(decodeBytes,StandardCharsets.UTF_8);
System.out.println(res);
}
最终输出的结果是 Hello world
这样就完成了编码和解码,要注意的是编码针对的是字节数组,解码后得到的也是一个字节数组,而转成字符串只是为了方便表示。
2.2 对图片进行base54编码和解码
为了方便的操作文件,这里使用了common-io中的IOUtils工具类来进行文件操作
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
编码
public static void main(String[] args) throws IOException {
//读取图片文件到内存中,得到字节数组
FileInputStream input = new FileInputStream("d:/666.png");
// 使用commons-io工具包的IOUtils工具类来读取文件
byte[] imgBytes = IOUtils.toByteArray(input);
//使用base64对字节数组编码,得到编码后的字节数组
byte[] encodeByte = Base64.getEncoder().encode(imgBytes);
//把编码后的字节数组转成字符串输出
String str=new String(encodeByte,StandardCharsets.UTF_8);
System.out.println(str);
}
最终会输出一个由可打印字符组成的长字符串,这个字符串就是上边图片对应的base64编码
解码
public static void main(String[] args) throws IOException {
//把上边生成的编码存到文件中,再从文件中读取,因为字符串太长了
FileInputStream input = new FileInputStream("d:/图片编码.txt");
byte[] bytes = IOUtils.toByteArray(input);
// 用base64解码得到解码后的字节数组
byte[] decodeBytes = Base64.getDecoder().decode(bytes);
//把新字节数组输出到文件中
IOUtils.write(decodeBytes,new FileOutputStream("d:/新图片.png"));
}
上边就实现了对图片的编码和解码。对于其他类型的文件处理方法是一样的,都是先获取到字节数组,然后对字节数组编码得到新的字节数组,再把字节数组输出就可以得到文件。