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

Java 如何确定zip文件的压缩方法,java,Java,我正在从第三方检索.zip文件。我想把这些解压到另一个文件夹。为此,我找到了一个方法,可以完全做到这一点,请参见下面的代码。它遍历所有文件并将其解压缩到另一个文件夹。然而,在观察相应的压缩方法时,我发现对于某些文件,这种情况会发生变化。对于某些文件,它声明:“无效的压缩方法”,之后它将中止对zip文件的进一步解压缩 由于压缩方法似乎有所改变,我怀疑我需要将压缩方法设置为正确的方法(不过这可能是一个错误的假设)。因此,我提出了一个问题:如何确定所需的压缩方法 我正在使用的代码: public vo

我正在从第三方检索.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
用于获取压缩方法

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

它将返回一个int,该int将

公共静态final int存储

公众静态最终整数缩减

-1
如果不知道方法


.

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

如果输出中的数字是ZIP方法,那么您遇到的最后一个条目将使用方法12(bzip2)进行压缩,这是Java ZIP实现不支持的。PKWare(ZIP格式的维护者)定期向ZIP规范中添加新的压缩方法,目前指定的压缩方法有12-15种(不确定确切数量)。Java只支持方法0(已存储)和8(已解压缩),如果您尝试使用不支持的压缩方法解压缩ZIP文件,则会抛出异常并显示消息“invalid compression method”


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

您指的是
.ZIP
vs
.rar
vs
.7zip
?@screenmut:我指的是.ZIP。(编辑了问题,谢谢)看,我刚刚修改了问题。我确实检查了方法,正如您所看到的,它发生了变化。但现在我意识到它甚至没有达到检查getMethod()的目的。该错误已在.GetNextery()发生,.zip文件是否正确?你能用其他应用程序解压吗?是的,.zip文件很好。另外,当我手动解压它,然后再次解压文件时,我的java程序能够正确解压它。这个问题可能不是由您的代码引起的。该文件由您的应用程序压缩?该文件由第三方压缩。不知道他们在那里的表现如何。我的手动解压和压缩是使用WinZip完成的。谢谢你的回答,非常有用。由于现在java似乎不是解压这些.zip文件的合适工具,您建议采用什么样的方法来执行此解压?java还有多个其他zip库,但我实际上怀疑它们是否支持更多的压缩方法。由于ZIP规范经常使用不兼容的扩展进行扩展,因此较旧的实现可能无法从其他实现读取文件,因此我将尝试使用更稳定的格式。