博客
关于我
工作中遇到的问题: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
    查看>>
    MySQL
    查看>>
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>