一、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"));
    }

上边就实现了对图片的编码和解码。对于其他类型的文件处理方法是一样的,都是先获取到字节数组,然后对字节数组编码得到新的字节数组,再把字节数组输出就可以得到文件。