0

我正在寻找一种提取 Zip 文件的方法。到目前为止,我已经尝试过 java.util.zip 和 org.apache.commons.compress,但都给出了损坏的输出。

基本上,输入是一个包含一个 .doc 文件的 ZIP 文件。

java.util.zip:输出损坏。org.apache.commons.compress:输出空白文件,但大小为 2 mb。

到目前为止,只有像 Winrar 这样的商业软件才能完美运行。有没有利用这个的java库?

这是我使用 java.util 库的方法:

public void extractZipNative(File fileZip)
{
    ZipInputStream zis;
    StringBuilder sb;
    try {
        zis = new ZipInputStream(new FileInputStream(fileZip));
        ZipEntry ze = zis.getNextEntry();

        byte[] buffer = new byte[(int) ze.getSize()];

        FileOutputStream fos = new FileOutputStream(this.tempFolderPath+ze.getName());

        int len;
        while ((len=zis.read(buffer))>0)
        {
            fos.write(buffer);
        }
        fos.flush();
        fos.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally 
    {
        if (zis!=null) 
        {
            try { zis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

非常感谢,迈克

4

5 回答 5

2

我认为您的输入可能会被一些“不兼容”的 zip 程序(如 7zip)压缩。尝试先调查它是否可以使用经典的 WinZip 等解压缩。

Java 的 zip 处理能够很好地处理来自“兼容” zip 压缩器的压缩档案。

于 2013-04-05T08:46:44.800 回答
2

这是我的代码中的错误。我需要指定字节写入的偏移量和长度。

于 2013-04-05T10:05:29.643 回答
1

这个对我有用

    ZipFile Vanilla = new ZipFile(new File("Vanilla.zip")); //zipfile defined and needs to be in directory
    Enumeration<? extends ZipEntry> entries = Vanilla.entries();// all (files)entries of zip file

    while(entries.hasMoreElements()){//runs while there is files in zip
        ZipEntry entry = entries.nextElement();//gets name of file in zip
        File folderw =new File("tkwgter5834");//creates new directory
        InputStream stream = Vanilla.getInputStream(entry);//gets input
        FileInputStream inpure= new FileInputStream("Vanilla.zip");//file input stream for zip file to read bytes of file
        FileOutputStream outter = new FileOutputStream(new File(folderw +"//"+ entry.toString())); //fileoutput stream creates file inside defined directory(folderw variable) by file's name
        outter.write(inpure.readAllBytes());// write into files which were created 
        outter.close();//closes fileoutput stream
    }
于 2021-04-10T22:00:34.423 回答
0

你试过jUnrar吗?也许它可能有效: https ://github.com/edmund-wagner/junrar

如果这也不起作用,我猜您的存档在某种程度上已损坏。

于 2013-04-05T08:49:40.837 回答
0

如果您知道要在其中运行此代码的环境,我认为您最好只调用系统为您解压缩它。它会比你在 java 中实现的任何东西都要快得多。

我编写了代码来提取带有嵌套目录的 zip 文件,它运行缓慢并且占用了大量 CPU。我最终用这个替换它:

    Runtime.getRuntime().exec(String.format("unzip %s -d %s", archive.getAbsolutePath(), basePath));

这样效果好很多。

于 2013-07-30T22:19:39.070 回答