java压缩文件解压:调用WinRAR5命令强于自己写代码实现

最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的

1、解压rar格式,采用的是java-unrar-0.3.jar

2、解压zip格式,采用的是commons-compress-1.4.1.jar

但最近根据用户反馈的问题,发现系统存在两个关于压缩文件解压的问题:

1、有些压缩文件解压之后出现中文乱码;

2、有些压缩文件根本不能解压



为了弥补上述两个问题,在之前代码的基础上打了一些补丁,来解决zip压缩包乱码的问题,思路大概是:

1、采用GBK编码解压

2、递归遍历解压的文件名是否存在中文乱码,这用到了网上很常用的中文检测正则表示式,[\u4e00-\u9fa5]+

3、如果存在中文乱码,则采用UTF-8编码解压

替换后,还是有人反映乱码问题,烦~~~

第二个问题报错如下(出现在有些rar格式解压时):

WARNING: exception in archive constructor maybe file is encrypted or currupt
de.innosystec.unrar.exception.RarException: badRarArchive
    at de.innosystec.unrar.Archive.readHeaders(Archive.java:238)
    at de.innosystec.unrar.Archive.setFile(Archive.java:122)
    at de.innosystec.unrar.Archive.<init>(Archive.java:106)
    at de.innosystec.unrar.Archive.<init>(Archive.java:96)
    at com.reverse.zipFile.CopyOfZipFileUtil.unrar(CopyOfZipFileUtil.java:242)
    at com.reverse.zipFile.CopyOfZipFileUtil.main(CopyOfZipFileUtil.java:303)


借助百度、谷歌找资料发现:

1、java解压文件有两种方式,一是自己写代码,二是调用压缩软件CMD执行

2、第二个错误是由于WinRAR5之后,在rar格式的基础上,推出了另一种rar,叫RAR5,而java-unrar解析不了这种格式

查看rar格式属性可以通过右键 —> 属性查看,如图

因此需要舍弃代码解压的方式,改为CMD调用的方式,虽然压缩软件有很多,但从网上能找到执行命令的,也就WinRAR了,所以我们采用WinRAR5之后的版本解决,5之前的版本肯定是不行的了



使用cmd方式效果如何呢?既能解决中文乱码问题,又能解压RAR5压缩文件,而且代码量还更少了,支持的格式也更多了。

附上CMD方式调用代码:

  /**
     * 采用命令行方式解压文件
     * @param zipFile 压缩文件
     * @param destDir 解压结果路径
     * @return
     */
    public static boolean realExtract(File zipFile, String destDir) {
        // 解决路径中存在/..格式的路径问题
        destDir = new File(destDir).getAbsoluteFile().getAbsolutePath();
        while(destDir.contains("..")) {
            String[] sepList = destDir.split("\\\\");
            destDir = "";
            for (int i = 0; i < sepList.length; i++) {
                if(!"..".equals(sepList[i]) && i < sepList.length -1 && "..".equals(sepList[i+1])) {
                    i++;
                } else {
                    destDir += sepList[i] + File.separator;
                }
            }
        }

        // 获取WinRAR.exe的路径,放在java web工程下的WebRoot路径下
        String classPath = "";
        try {
            classPath = Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath();
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
        // 兼容main方法执行和javaweb下执行
        String winrarPath = (classPath.indexOf("WEB-INF") > -1 ? classPath.substring(0, classPath.indexOf("WEB-INF")) :
            classPath.substring(0, classPath.indexOf("classes"))) + "/WinRAR/WinRAR.exe";
        winrarPath = new File(winrarPath).getAbsoluteFile().getAbsolutePath();
        System.out.println(winrarPath);

        boolean bool = false;
        if (!zipFile.exists()) {
            return false;
        }

        // 开始调用命令行解压,参数-o+是表示覆盖的意思
        String cmd = winrarPath + " X -o+ " + zipFile + " " + destDir;
        System.out.println(cmd);
        try {
            Process proc = Runtime.getRuntime().exec(cmd);
            if (proc.waitFor() != 0) {
                if (proc.exitValue() == 0) {
                    bool = false;
                }
            } else {
                bool = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("解压" + (bool ? "成功" : "失败"));
        return bool;
    }

原文地址:https://www.cnblogs.com/zhang90030/p/9686127.html

时间: 2024-11-04 02:17:17

java压缩文件解压:调用WinRAR5命令强于自己写代码实现的相关文章

文件的压缩与解压/打包命令

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; f

java 压缩以及解压文件,有tar,zip,gz(gizp)和解压

package com.yabsz.decompCompr; import java.io.File; import java.util.ArrayList; import java.util.List; public class main { public static void main(String[] args) { //需要下载commons-net-ftp-2.0.jar包下载地址:http://download.csdn.net/detail/u010696272/8006739

java压缩与解压

一 概述 1.目录进入点 目录进入点是文件在压缩文件中的映射,代表压缩文件.压缩文件时,创建目录进入点,将文件写入该目录进入点.解压时,获取目录进入点,将该目录进入点的内容写入硬盘指定文件. 如果目录进入点是一个文件夹,在命名时必须以路径分隔符结尾,在Window操作系统中名称分隔符为"/". 2.文件的自动创建 无论是调用createNewFile()创建文件,还是在创建输出流时由输出流负责创建文件,都必须保证父路径已经存在,否则文件无法创建. 3.目录的创建 mkdirs():创建

linux 压缩、解压 {大全}

.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) --------------- .gz 解压1:gunzip FileName.gz 解压2:gzip -d FileName.gz 压缩:gzip FileName .tar.gz 和 .tgz 解压:tar zxvf FileName.tar.gz 压缩:tar zcvf FileName.tar.gz DirName ---------

Linux 下 zip 文件解压乱码解决方案,ubuntu16.10亲测可用

文章来源: https://www.zhihu.com/question/20523036 今天邮件中收到了一个压缩文件,解压后却是乱码,从网上也找了几个方法,目前这个方法还是比较可靠的,如下所示: 7z方案 需要安装p7zip和convmv,在Fedora下的命令是 su -c 'yum install p7zip convmv' 在ubuntu下的安装命令是 sudo apt-get install p7zip convmv 安装完之后,就可以用7za和convmv两个命令完成解压缩任务.

Java实现文件压缩与解压[zip格式,gzip格式]

Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩. Java I/O类库还收录了一些能读写压缩格式流的类.要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了.这些类不是Reader和Writer,而是Inpu

续写vim,shell脚本基础编辑,read命令,if与case判断语句,文件查找方式,压缩与解压,

一. Vim续写 ?1.命令扩展模式的位置定界 ??起始位置 cmd 终止位置???Cmd:????y复制????d删除????Gu变大写????gu变小写??例如:0y$命令意味着:????0 先到行头????Y 从这里开始拷贝????$ 拷贝到本行行尾最后一个字符????Ye 从当前位置拷贝到本单词的最后一个字符 ?2.扩展命令模式:地址定界 ? ?# 具体第#行,? ?#1,#2 从开头数第#1行到第#2行? ?#1,+#2 从开头数的第#1行到从第#1行开始数的第#2行? ? ?例:2,

(转)使用 linux tar 命令压缩与解压文件

原文链接 http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的参数是根据需要在压缩或解压档案时可选的. -z:有gzip属性的-j:有bz2属性的-Z:有compress属性的-v:显示所有过程-O:将文件解开到标准输出

java实现文件压缩与解压

用java实现文件的压缩与解压是很常见的功能. 我最爱上代码: 1 import java.io.File; 2 import java.util.ArrayList; 3 import java.util.List; 4 5 import net.lingala.zip4j.core.ZipFile; 6 import net.lingala.zip4j.model.ZipParameters; 7 import net.lingala.zip4j.util.Zip4jConstants; 8