博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工作中遇到的问题:PDF转成二进制流的字符串,及将二进制流反转成PDF20210520
阅读量:721 次
发布时间:2019-03-21

本文共 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/

你可能感兴趣的文章