博客
关于我
工作中遇到的问题:PDF转成二进制流的字符串,及将二进制流反转成PDF20210520
阅读量:725 次
发布时间:2019-03-21

本文共 2682 字,大约阅读时间需要 8 分钟。

关于Java Base64编码与解码的优化与解决方案

1. 添加依赖包

在项目中添加 sun.misc.BASE64Encodersun.misc.BASE64Decoder 包。

注意:在某些IDE或环境中,这些类可能会被限制访问,例如在.jreSystem Library中,权限可能不允许访问这些类。为了解决此问题,您需要:

  • 右键项目 → 属性 → Java Build Path → JRE System Library → 紧急中心单击,进入属性窗口。
  • 在“访问规则”部分,找到sun.misc包,右键选择“可访问性”并输入*, 依次输入允许的版本号。
  • 单击确定。
  • 2.兼容性问题

    如果您遇到无法访问 sun.misc.BASE64Encoder 或其他问题,建议考虑以下解决方案:

    • 使用更现代的 Base64 编码工具:比如 javax.xml.bind.DatatypeConverter(适用于 Java 8 及以上)或 Apache 的 Base64 库。
    • 强制访问 sun.misc 包:如前所述,通过 IDE 配置访问权限。

    3. 关于 Base64 编码与解码

    以下是对代码的解释及优化建议:

    3.1 fromPdfToBinary方法
    private static String fromPdfToBinary(String filePath) {    try {        FileInputStream fis = new FileInputStream(new File(filePath));        BufferedInputStream bis = new BufferedInputStream(fis);        ByteArrayOutputStream baos = new ByteArrayOutputStream();        BufferedOutputStream 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();        return encoder.encodeBuffer(bys).trim();    } catch (FileNotFoundException | IOException e) {        e.printStackTrace();    }}

    优化建议

    • 读取缓冲策略:使用适当的缓冲大小或直接使用DataOutputStream来提高读取效率。
    • 密封尝试块:使用try-with-resources来自动处理输入流和输出流资源。
    • 异常处理:确保对所有捕获的异常进行处理,并提供友好的错误信息。
    3.2 fromBinaryToPdf方法
    private static void fromBinaryToPdf(String pdfBase64Str, String filePath) {    try {        byte[] bytes = decoder.decodeBuffer(pdfBase64Str);        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);        BufferedInputStream bis = new BufferedInputStream(bais);        File file = new File(filePath);        FileOutputStream fos = new FileOutputStream(file);        BufferedOutputStream 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 e) {            e.printStackTrace();        }    }}

    优化建议

    • 确保正确关闭流:在finally块中确保所有流都被正确关闭,避免资源泄漏。
    • 提高读取效率:使用适当的缓存大小,如1024字节,以提高读取和写入速度。
    • 简化代码结构:可以利用ByteArrayInputStreamByteArrayOutputStream来减少中间对象的数量。

    4. 常见问题

    • PDF打印字体不符:首先确保默认的打印字体设置正确,或者在代码中手动指定字体。
    • 文件路径问题:确保函数参数filePathpdfBase64Str用法正确,路径完整。

    5. 建议工具

    如果不想手动处理 Base64 编码,可以使用在线工具或开源库:

    • Ez APIs:提供多种编码工具。
    • ** Apache Commons Codec**:提供Base64编码功能。
    • Google Closure库:支持 Base64 转换。

    建议参考相关文档,确保您的工具支持需要的编码和解码方式。

    如果您有更多技术问题,欢迎随时咨询!

    转载地址:http://yidgz.baihongyu.com/

    你可能感兴趣的文章
    MsEdgeTTS开源项目使用教程
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse更改项目名web发布名字不改问题
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
    查看>>
    myeclipse配置springmvc教程
    查看>>
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>