离散型羽毛 2024-01-15 10:20 采纳率: 0%
浏览 10

Spring+Gradle项目。部署在linux服务器上。解压压缩包,出现中文乱码,该怎么解决?

项目背景:服务器邮箱,收取各种邮件,邮件中有各种文件格式的附件,需要对这些文件进行解析,并且归档到ftp文件夹内。

问题详情:收取的各种邮件中,包括zip,rar,7z等各种压缩包文件,而且还是带有解压密码的。一开始引入了net.sf.sevenzipjbinding这个依赖(版本16.02-2.01),用于处理所有的压缩包文件。文件的内容解析,没有出现问题,但是文件的名称,在解压以后出现了乱码,导致无法归档。

查阅资料后,linux系统下,默认是UTF-8用于解压缩,导致乱码。而且sevenzipjbinding这个包,并没有找到入口,可以在解压的时候设置GBK等编码格式。

有什么依赖,既可以解压7z这种格式,又可以设置GBK编码,又可以支持解压密码的?或者有什么别的解决方案?

  • 写回答

3条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-01-15 11:16
    关注

    首先,关于你现在遇到的问题,sevenzipjbinding库本身支持设置字符编码,但是API比较隐蔽,使用起来不太方便,并且 sevenzipjbinding 这个库的更新已经比较少了,可能在某些特殊的压缩格式处理上可能存在问题。
    解决你的问题的一个备选方案是可以使用Apache Commons Compress库。Apache Commons Compress 库支持很多压缩和归档格式,如7z,ar,arj,bz2,cpio,dump,gz,jar,lzma,pack200,rar, tar, xz 和 zip。对应的编码处理也比较成熟。
    以下代码演示了如何使用 Apache Commons Compress 解压 7z 文件,假设我们有一个名为 example.7z 的归档文件:

    import org.apache.commons.compress.archivers.sevenz.*;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            SevenZFile sevenZFile = new SevenZFile(new File("example.7z"));
            SevenZArchiveEntry entry = sevenZFile.getNextEntry();
            while(entry != null){
                System.out.println(entry.getName());
    
                FileOutputStream out = new FileOutputStream(entry.getName());
                byte[] content = new byte[(int) entry.getSize()];
                sevenZFile.read(content, 0, content.length);
                out.write(content);
                out.close();
                entry = sevenZFile.getNextEntry();
            }
            sevenZFile.close();
        }
    }
    
    

    这段代码将获取归档文件的每一个条目,并写入到当前目录下的同名文件。注意,如果你的文档中的文件有目录结构,你需要确保在解压之前,这些目录已经存在,否则你可能会遇到问题。
    至于编码问题,虽然Commons Compress没有提供直接转换编码的API,但可以通过Java的String来进行转换。下面是一个例子:

    String unicodeName = new String(entry.getName().getBytes("GBK"), "UTF-8");
    
    

    这行代码将会获取每一个压缩条目的名字,并将其从GBK转为UTF-8编码,然后你可以用转换后的名字来创建文件。
    最后的密码问题,由于7z的加密标准和zip等其他格式不一样(7z使用的是AES-256加密),现阶段Apache Commons Compress还不支持处理7z的密码保护。不过鉴于Apache Commons Compress的强大和灵活,它仍是一个值得考虑的选择。如果你有处理7z密码保护的需求,可能需要寻找其它的方案了。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月15日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?