本文共 3492 字,大约阅读时间需要 11 分钟。
package com.base64Test.baymax;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/** * @author Baymax * @version 1.0 2021/05/20 */public class Base64Test { static BASE64Encoder encoder = new sun.misc.BASE64Encoder(); static BASE64Decoder decoder = new sun.misc.BASE64Decoder(); public static void main(String[] args) { // PDF通过Base64方式转为二进制字节流 String pdfBase64Str = fromPdfToBinary("E:/Test20210520.pdf"); System.out.println("转换后的字节流/n:" + pdfBase64Str); // 二进制字节流反转为PDF,保存到本地指定文件夹中 fromBinaryToPdf(pdfBase64Str,"E:/HelloWorld.pdf"); } /** * 将base64编码转换成PDF,保存到 * @param base64sString * 1.使用BASE64Decoder对编码的字符串解码成字节数组 * 2.使用底层输入流ByteArrayInputStream对象从字节数组中获取数据; * 3.建立从底层输入流中读取数据的BufferedInputStream缓冲输出流对象; * 4.使用BufferedOutputStream和FileOutputSteam输出数据到指定的文件中 * * @param pdfBase64Str * @param filePath */ private static void fromBinaryToPdf(String pdfBase64Str, String filePath) { BufferedInputStream bis=null; FileOutputStream fos=null; BufferedOutputStream bos=null; try { //将Base64编码的字符串解码为字节数组 byte[] bytes=decoder.decodeBuffer(pdfBase64Str); //创建一个将bytes作为其缓冲区的ByteArrayInputStream对象 ByteArrayInputStream bais=new ByteArrayInputStream(bytes); //创建从底层输入流中读取数据的缓冲输入流对象 bis=new BufferedInputStream(bais); //指定输出的文件 File file=new File(filePath); //创建到指定文件的输出流 fos=new FileOutputStream(file); //为文件输出流对接缓冲输出流对象 bos=new BufferedOutputStream(fos); byte[] buffers=new byte[1024]; int len=bis.read(buffers); while(len!=-1){ bos.write(buffers, 0, len); len=bis.read(buffers); } //刷新输出流 bos.flush(); } catch (IOException e) { e.printStackTrace(); }finally { try { bis.close(); fos.close(); bos.close(); } catch (IOException e2) { e2.printStackTrace(); } } } /** * 将PDF转换成base64编码 1.使用BufferedInputStream和FileInputStream从File指定的文件中读取内容 * 2.然后建立写入到ByteArrayOutputStream底层输出流对象的缓冲输出流BufferedOutputStream * 3.底层输出流转换成字节数组,然后由BASE64Encoder的对象对流进行编码 */ private static String fromPdfToBinary(String filePath) { FileInputStream fis = null; BufferedInputStream bis = null; ByteArrayOutputStream baos = null; BufferedOutputStream bos = null; try { // 建立读取文件的文件流 fis = new FileInputStream(new File(filePath)); // 在文件输出流上安装节点流(更大效率读取) bis = new BufferedInputStream(fis); // 创建一个新的byte数组输出流,具有指定大小的缓冲容量 baos = new ByteArrayOutputStream(); // 创建一个新的 缓冲输出流,将数据写入指定的底层输出流 bos = new BufferedOutputStream(baos); // 字节数组 byte[] bytes = new byte[1024]; int len = bis.read(bytes); while (len != -1) { bos.write(bytes, 0, len); len = bis.read(bytes); } // 刷新此输出流并强制写出所有缓冲的输出字节 bos.flush(); byte[] bys = baos.toByteArray(); // sun公司的API return encoder.encodeBuffer(bys).trim(); // apache公司的API // return Base64.encodeBase64String(bytes); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); bis.close(); bos.close(); } catch (IOException e) { e.printStackTrace(); } } return null; }}
①为工程添加 sun.misc.BASE64Encoder和sun.misc.BASE64Decoder包:
②导包后可能会遇到问题:解决方法:右键项目》属性》Java Build Path》jre System Library 》access rules 双击 add》resolution选择accessible,下面填上**点击确定即可!
转载地址:http://yidgz.baihongyu.com/