解压缩.zip文件时,ZipInputStream getNextEntry为null

时间:2011-09-26 20:39:00

标签: java file null zip extract

我正在尝试提取.zip文件,我正在使用此代码:

String zipFile = Path + FileName;

FileInputStream fin = new FileInputStream(zipFile);
ZipInputStream zin = new ZipInputStream(fin);

ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
    UnzipCounter++;
    if (ze.isDirectory()) {
        dirChecker(ze.getName());
    } else {
        FileOutputStream fout = new FileOutputStream(Path
                + ze.getName());
        while ((Unziplength = zin.read(Unzipbuffer)) > 0) {
            fout.write(Unzipbuffer, 0, Unziplength);                    
        }
        zin.closeEntry();
        fout.close();

    }
}
zin.close();

但问题是,在调试时,当代码到达while(!= null)部分时,zin.getNextEntry()始终为null,因此它不会提取任何内容。
.zip文件是150kb ..我该如何解决这个问题?

.zip存在

我使用的代码来编写.zip:

URL=intent.getStringExtra("DownloadService_URL");
    FileName=intent.getStringExtra("DownloadService_FILENAME");
    Path=intent.getStringExtra("DownloadService_PATH");
     File PathChecker = new File(Path);
    try{

    if(!PathChecker.isDirectory())
        PathChecker.mkdirs();

    URL url = new URL(URL);
    URLConnection conexion = url.openConnection();

    conexion.connect();
    int lenghtOfFile = conexion.getContentLength();
    lenghtOfFile/=100;

    InputStream input = new BufferedInputStream(url.openStream());
    OutputStream output = new FileOutputStream(Path+FileName);

    byte data[] = new byte[1024];
    long total = 0;

    int count = 0;
    while ((count = input.read(data)) != -1) {
        output.write(data, 0, count);
        total += count;

        notification.setLatestEventInfo(context, contentTitle, "جاري تحميل ملف " + FileName + " " + (total/lenghtOfFile), contentIntent);
        mNotificationManager.notify(1, notification);
    }


    output.flush();
    output.close();
    input.close();

6 个答案:

答案 0 :(得分:6)

当您使用ZipInputStream读取zip文件时,可能会遇到以下问题:Zip文件包含序列中的条目和其他结构信息。此外,它们包含文件最末端(!)的所有条目的注册表。只有此注册表确实提供了有关正确的zip文件结构的完整信息。因此,通过使用流来读取序列中的zip文件有时会导致“猜测”,这可能会失败。这是所有zip实现的常见问题,不仅适用于java.util.zip。更好的方法是使用ZipFile,它从文件末尾的注册表中确定结构。您可能需要阅读http://commons.apache.org/compress/zip.html,其中会提供更多详细信息。

答案 1 :(得分:3)

如果Zip放在与这个名为“91.zip”的确切来源相同的目录中,它就可以正常工作。

import java.io.*;
import java.util.zip.*;

class Unzip {
    public static void main(String[] args) throws Exception {
        String Path = ".";
        String FileName = "91.zip";
        File zipFile = new File(Path, FileName);

        FileInputStream fin = new FileInputStream(zipFile);
        ZipInputStream zin = new ZipInputStream(fin);

        ZipEntry ze = null;
        int UnzipCounter = 0;
        while ((ze = zin.getNextEntry()) != null) {
            UnzipCounter++;
            //if (ze.isDirectory()) {
            //  dirChecker(ze.getName());
            //} else {
                byte[] Unzipbuffer = new byte[(int) pow(2, 16)];
                FileOutputStream fout = new FileOutputStream(
                    new File(Path, ze.getName()));
                int Unziplength = 0;
                while ((Unziplength = zin.read(Unzipbuffer)) > 0) {
                    fout.write(Unzipbuffer, 0, Unziplength);
                }
                zin.closeEntry();
                fout.close();
            //}
        }
        zin.close();
    }
}

BTW

  1. 那个MP3,阿拉伯语的语言是什么?
  2. 我必须改变源代码才能让它编译。<​​/ li>
  3. 我使用带有两个File参数的String构造函数,自动插入正确的分隔符。

答案 2 :(得分:1)

试试这段代码: -

private boolean extractZip(String pathOfZip,String pathToExtract)
 {


        int BUFFER_SIZE = 1024;
        int size;
        byte[] buffer = new byte[BUFFER_SIZE];


        try {
            File f = new File(pathToExtract);
            if(!f.isDirectory()) {
                f.mkdirs();
            }
            ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream(pathOfZip), BUFFER_SIZE));
            try {
                ZipEntry ze = null;
                while ((ze = zin.getNextEntry()) != null) {
                    String path = pathToExtract  +"/"+ ze.getName();

                    if (ze.isDirectory()) {
                        File unzipFile = new File(path);
                        if(!unzipFile.isDirectory()) {
                            unzipFile.mkdirs();
                        }
                    }
                    else {
                        FileOutputStream out = new FileOutputStream(path, false);
                        BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE);
                        try {
                            while ( (size = zin.read(buffer, 0, BUFFER_SIZE)) != -1 ) {
                                fout.write(buffer, 0, size);
                            }

                            zin.closeEntry();
                        }catch (Exception e) {
                            Log.e("Exception", "Unzip exception 1:" + e.toString());
                        }
                        finally {
                            fout.flush();
                            fout.close();
                        }
                    }
                }
            }catch (Exception e) {
                Log.e("Exception", "Unzip exception2 :" + e.toString());
            }
            finally {
                zin.close();
            }
            return true;
        }
        catch (Exception e) {
            Log.e("Exception", "Unzip exception :" + e.toString());
        }
        return false;

    }

答案 3 :(得分:0)

这段代码对我来说很好。也许您需要检查zipFile字符串是否有效?

    String zipFile = "C:/my.zip";

    FileInputStream fin = new FileInputStream(zipFile);
    ZipInputStream zin = new ZipInputStream(fin);

    ZipEntry ze = null;
    while ((ze = zin.getNextEntry()) != null) {
        System.out.println("got entry " + ze);
    }
    zin.close();

在3.3Mb zip文件上生成有效结果。

答案 4 :(得分:0)

此代码似乎对我有效。

您确定您的zip文件是有效的zip文件吗?如果文件不存在或不可读,那么您将获得FileNotFoundException,但如果文件为空或者不是有效的zip文件,那么您将获得ze == null。

while ((ze = zin.getNextEntry()) != null) {

您指定的zip文件不是有效的zip文件。条目的大小是4294967295

while ((ze = zin.getNextEntry()) != null) {
    System.out.println("ze=" + ze.getName() + " " + ze.getSize());
    UnzipCounter++;

这给出了:

ze=595.mp3 4294967295
...
Exception in thread "main" java.util.zip.ZipException: invalid entry size (expected 4294967295 but got 341297 bytes)
    at java.util.zip.ZipInputStream.readEnd(ZipInputStream.java:386)
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:156)
    at java.io.FilterInputStream.read(FilterInputStream.java:90)
    at uk.co.farwell.stackoverflow.ZipTest.main(ZipTest.java:29)

使用有效的zip文件试用您的代码。

答案 5 :(得分:0)

我知道答案来晚了,但是无论如何.. 我认为问题出在

if(!PathChecker.isDirectory())
    PathChecker.mkdirs();

应该是

if(!PathChecker.getParentFile().exists())
    PathChecker.getParentFile().mkdirs();