Search code examples
javafilenullzipextract

ZipInputStream getNextEntry is null when extracting .zip files


I'm trying to extract .zip files and I'm using this code:

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();

but the problem is that, while debugging, when the code reaches the while(!=null) part, the zin.getNextEntry() is always null so it doesnt extract anything..
The .zip file is 150kb.. How can I fix this?

The .zip exists

Code I use to dl the .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();

Solution

  • If the Zip is placed in the same directory as this exact source, named "91.zip", it works just fine.

    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. what is the language in that MP3, Arabic?
    2. I had to alter the source to get it to compile.
    3. I used the File constructor that takes two String arguments, to insert the correct separator automatically.