【问题标题】:How to determine the compression method of a zip file如何确定一个zip文件的压缩方式
【发布时间】:2014-06-23 14:15:08
【问题描述】:

我正在从第三方检索 .zip 文件。我想将它们解压缩到另一个文件夹。为此,我找到了一种完全可以做到这一点的方法,请参见下面的代码。它遍历所有文件并将它们解压缩到另一个文件夹。但是,当观察相应的压缩方法时,我发现某些文件会发生这种变化。对于某些文件,它声明:"invalid compression method",之后它会中止对 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

【问题讨论】:

标签: java


【解决方案1】:

使用zEntry.getMethod()获取压缩方式

返回条目的压缩方法,如果未指定,则返回 -1。

它会返回一个int,它将是

public static final int STORED

public static final int DEFLATED

-1,如果它不知道方法。

Docs.

【讨论】:

  • 我刚刚修改了问题。我确实检查了该方法,并且您可以看到它发生了变化。但现在我意识到它甚至没有达到检查 getMethod() 的程度。错误已经发生在 .getNextExtry()...
  • .zip 文件是否正确?可以用其他应用提取吗?
  • 是的,.zip 文件就可以了。此外,当我手动解压缩然后再次压缩文件时,我的 java 程序能够正确解压缩它。
  • 问题不可能是你的代码引起的。该文件已被您的应用程序压缩?
  • 文件被第三方压缩。不知道他们在那里的拉链是如何进行的。我的手动解压和压缩是使用 WinZip 完成的。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回答,非常有用。由于现在 java 似乎不是解压缩这些 .zip 文件的合适工具,您建议使用哪种方法来执行此解压缩?
  • Java 有多个其他 ZIP 库,但我实际上怀疑它们是否支持更多的压缩方法。由于 ZIP 规范经常使用不兼容的扩展名进行扩展,因此较旧的实现可能无法从其他实现中读取文件,因此我会尝试使用更稳定的格式。
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2022-07-06
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多