java - 如何确定 zip 文件的压缩方法

标签 java

我正在从第三方检索 .zip 文件。我想将它们解压缩到另一个文件夹。为此,我找到了一种完全可以做到这一点的方法,请参阅下面的代码。它遍历所有文件并将它们解压缩到另一个文件夹。然而,当观察相应的压缩方法时,我发现某些文件的情况发生了变化。对于某些文件,它会指出:“无效的压缩方法”,之后它会中止进一步解压缩 zip 文件。

由于压缩方法似乎发生了变化,我怀疑我需要将压缩方法设置为正确的方法(但这可能是一个错误的假设)。那么我的问题是:如何确定所需的压缩方法?

我正在使用的代码:

public void unZipIt(String zipFile, String outputFolder){

    //create output directory is not exists
    File folder = new File(OUTPUT_FOLDER);
    if(!folder.exists()){
        folder.mkdir();
    }

    FileInputStream fis = null;
    ZipInputStream zipIs = null;
    ZipEntry zEntry = null;
    try 
    {
        fis = new FileInputStream(zipFile);
        zipIs = new ZipInputStream(new BufferedInputStream(fis));

        while((zEntry = zipIs.getNextEntry()) != null){
            System.out.println(zEntry.getMethod());
            try{
                byte[] tmp = new byte[4*1024];
                FileOutputStream fos = null;
                String opFilePath = OUTPUT_FOLDER + "\\" + zEntry.getName();
                System.out.println("Extracting file to "+opFilePath);
                fos = new FileOutputStream(opFilePath);
                int size = 0;
                while((size = zipIs.read(tmp)) != -1){
                    fos.write(tmp, 0 , size);
                }
                fos.flush();
                fos.close();
            } catch(IOException e){
                System.out.println(e.getMessage());
            }
        }
        zipIs.close();
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    } 
    catch(IOException ex){
        System.out.println(ex.getMessage());
    }

}

目前我正在检索以下输出:

8
Extracting file to     C:\Users\nlmeibe2\Documents\Projects\Output_test\SOPHIS_cptyrisk_tradedata_1192_20140616.csv
8
Extracting file to C:\Users\nlmeibe2\Documents\Projects\Output_test\SOPHIS_cptyrisk_underlying_1192_20140616.csv
0
Extracting file to C:\Users\nlmeibe2\Documents\Projects\Output_test\10052013/
12
Extracting file to     C:\Users\nlmeibe2\Documents\Projects\Output_test\MRM_Daily_Position_Report_Package_Level_Underlying_View_EQB_v2_COBDATE_2014-06-16_RUNDATETIME_2014-06-17-04h15.csv
invalid compression method
invalid compression method

最佳答案

由于您只打印异常消息而不打印堆栈跟踪(带有行号),因此不可能确切知道异常在哪里引发,但我认为直到您实际尝试从 ZipEntry 中读取时才会引发异常。

如果输出中的数字是 ZIP 方法,则您遇到的最后一个条目是使用方法 12 (bzip2) 进行压缩的,而 Java ZIP 实现不支持该方法。 PKWare(ZIP 格式的维护者)定期向 ZIP 规范添加新的压缩方法,目前指定了大约 12-15 种(不确定具体数量)压缩方法。 Java 仅支持方法 0(存储)和 8(压缩),如果您尝试使用不受支持的压缩方法解压缩 ZIP 文件,则会抛出异常并显示消息“无效的压缩方法”。

WinZip 和 Windows 中的 ZIP 函数都可能使用 Java API 不支持的压缩方法。

关于java - 如何确定 zip 文件的压缩方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24368236/

相关文章:

java - 现在,我如何知道最后一次调用 ChildEventListener.onChildAdded() 的时间?

java - Android Studio 从所有 Activity 中获取字符串

java - 如何在jdbc中为事务设置局部变量

java - 具有从父类(super class)继承的属性的托管 Bean

java - Intellij 运行配置 Spring Boot 与 Maven 问题

java.lang.ClassNotFoundException : org. apache.http.util.Args - 我应该添加哪个依赖项?

java - 减少Java应用程序中 'ifs'的使用

java - If 语句中的两个 ArrayList 项

java - 如何使用jooq来表达mysql REGEXP?

java - 使用 JAXP(JEE6) 解析简单的 XML 文档