博客
关于我
工作中遇到的问题: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/

    你可能感兴趣的文章
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>
    MySQL与Oracle的数据迁移注意事项,另附转换工具链接
    查看>>
    mysql丢失更新问题
    查看>>
    MySQL两千万数据优化&迁移
    查看>>
    MySql中 delimiter 详解
    查看>>
    MYSQL中 find_in_set() 函数用法详解
    查看>>
    MySQL中auto_increment有什么作用?(IT枫斗者)
    查看>>
    MySQL中B+Tree索引原理
    查看>>
    mysql中cast() 和convert()的用法讲解
    查看>>
    mysql中datetime与timestamp类型有什么区别
    查看>>
    MySQL中DQL语言的执行顺序
    查看>>