Tutorial

Java Unzip File Example

Published on August 3, 2022
author

Pankaj

Java Unzip File Example

Welcome to Java Unzip File Example. In the last post, we learned how to zip file and directory in java, here we will unzip the same zip file created from directory to another output directory.

Java Unzip File

To unzip a zip file, we need to read the zip file with ZipInputStream and then read all the ZipEntry one by one. Then use FileOutputStream to write them to file system. We also need to create the output directory if it doesn’t exists and any nested directories present in the zip file. Here is the java unzip file program that unzips the earlier created tmp.zip to output directory.

package com.journaldev.files;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipFiles {

    public static void main(String[] args) {
        String zipFilePath = "/Users/pankaj/tmp.zip";
        
        String destDir = "/Users/pankaj/output";
        
        unzip(zipFilePath, destDir);
    }

    private static void unzip(String zipFilePath, String destDir) {
        File dir = new File(destDir);
        // create output directory if it doesn't exist
        if(!dir.exists()) dir.mkdirs();
        FileInputStream fis;
        //buffer for read and write data to file
        byte[] buffer = new byte[1024];
        try {
            fis = new FileInputStream(zipFilePath);
            ZipInputStream zis = new ZipInputStream(fis);
            ZipEntry ze = zis.getNextEntry();
            while(ze != null){
                String fileName = ze.getName();
                File newFile = new File(destDir + File.separator + fileName);
                System.out.println("Unzipping to "+newFile.getAbsolutePath());
                //create directories for sub directories in zip
                new File(newFile.getParent()).mkdirs();
                FileOutputStream fos = new FileOutputStream(newFile);
                int len;
                while ((len = zis.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
                }
                fos.close();
                //close this ZipEntry
                zis.closeEntry();
                ze = zis.getNextEntry();
            }
            //close last ZipEntry
            zis.closeEntry();
            zis.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

}

Once the program finishes, we have all the zip file contents in the output folder with same directory hierarchy. Output of the above program is:

Unzipping to /Users/pankaj/output/.DS_Store
Unzipping to /Users/pankaj/output/data/data.dat
Unzipping to /Users/pankaj/output/data/data.xml
Unzipping to /Users/pankaj/output/data/xmls/project.xml
Unzipping to /Users/pankaj/output/data/xmls/web.xml
Unzipping to /Users/pankaj/output/data.Xml
Unzipping to /Users/pankaj/output/DB.xml
Unzipping to /Users/pankaj/output/item.XML
Unzipping to /Users/pankaj/output/item.xsd
Unzipping to /Users/pankaj/output/ms/data.txt
Unzipping to /Users/pankaj/output/ms/project.doc

That’s all about java unzip file example.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the author(s)

Category:
Tutorial
Tags:

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
January 29, 2014

Hi Pankaj Nice code !! How could i do this with two zip paths (i.e two zip files present inside the same directory but different files names) and two different destination directories? So basically i would like my java program to unzip C:\users\1.zip to C:\output\ & C:\users\2.zip to C:\output_2\ . Please advise. Thanks

- Grant

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    April 7, 2017

    Very helpful code… Thanks…Thanks alot. Now I need a code to merge the multiple videos into one video (the videos belongs to one folder.) using java the videos are consist of .webm extension. Thanks,

    - sainath

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      September 18, 2017

      Perfect. A cut/paste example that works perfectly well.

      - Payments

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        October 11, 2017

        Pankaj, Its really good stuff, i can able to extract the files Tahnks

        - Arun

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          October 11, 2017

          Its really nice work to extract the files. code simplifies the tasks.

          - Arun

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            November 27, 2017

            But this code will not work in the case of extracting any file in external SDcard. Check once and post an updated one.

            - Anonymous

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              November 28, 2017

              This does not handle zip folders that contain sub directories. You need to differentiate between a file and directory in the code

              - rw

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                February 10, 2018

                This code is not working

                - anshu

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                April 6, 2018

                yes bro same happend with me.

                - pankaj

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  May 11, 2018

                  can any one give me 100% generated test case of junit of above code

                  - Nirdesh Kumar

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    November 20, 2018

                    How to unzip folder having file names with special characters for e.g. test.zip having file with name fndStaticLookups_finder=LookupTypeFinder%3BBindLookupType%3DACTIVITY_SHOWTIMEAS_CD.json

                    - Ashok

                      JournalDev
                      DigitalOcean Employee
                      DigitalOcean Employee badge
                      December 12, 2018

                      The code will fail when a ZipEntry is only a directory. You must make a check of it. if(ze.isDirectory()){…}

                      - Yeung

                        JournalDev
                        DigitalOcean Employee
                        DigitalOcean Employee badge
                        December 26, 2018

                        Hi Pankaj, The code is working well if zip not contains any file in it if the zip contains any file then its throws file not found exception. Thanks Ajaya

                        - Ajaya

                          JournalDev
                          DigitalOcean Employee
                          DigitalOcean Employee badge
                          February 25, 2019

                          Hiii, Can we unzip .7z format? i am not getting any reasult for unzip .7z file format

                          - Painter Priyank

                          JournalDev
                          DigitalOcean Employee
                          DigitalOcean Employee badge
                          July 14, 2020

                          did you find any solution?

                          - samra

                            JournalDev
                            DigitalOcean Employee
                            DigitalOcean Employee badge
                            September 12, 2019

                            This code as-is does not work with sub directories.

                            - Manoj Kidambi

                              JournalDev
                              DigitalOcean Employee
                              DigitalOcean Employee badge
                              October 29, 2019

                              This code is insecure and vulnerable to the Zip Slip vulnerability. https://snyk.io/research/zip-slip-vulnerability

                              - Florent Guillaume

                                JournalDev
                                DigitalOcean Employee
                                DigitalOcean Employee badge
                                June 17, 2020

                                This is the code I’m using which is working fine with sub directories. No external libraries used. package main.java; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class UnzipFile { public static void main(String[] args) throws IOException { String fileZip = “src/main/resources/abcd/abc.zip”; File destDir = new File(“src/main/resources/abcd”); try (ZipFile file = new ZipFile(fileZip)) { Enumeration zipEntries = file.entries(); while (zipEntries.hasMoreElements()) { ZipEntry zipEntry = zipEntries.nextElement(); if (zipEntry.isDirectory()) { String subDir = destDir + “\\” + zipEntry.getName(); File as = new File(subDir); as.mkdirs(); } else { // Create new json file File newFile = new File(destDir, zipEntry.getName()); String extractedDirectoryPath = destDir.getCanonicalPath(); String extractedFilePath = newFile.getCanonicalPath(); if (!extractedFilePath.startsWith(extractedDirectoryPath + File.separator)) { throw new IOException("Entry is outside of the target dir: " + zipEntry.getName()); } BufferedInputStream inputStream = new BufferedInputStream(file.getInputStream(zipEntry)); try (FileOutputStream outputStream = new FileOutputStream(newFile)) { while (inputStream.available() > 0) { outputStream.write(inputStream.read()); } } } } } } }

                                - Chamlini

                                JournalDev
                                DigitalOcean Employee
                                DigitalOcean Employee badge
                                April 20, 2021

                                thanks your code really solved the sub directories issue. Also i was getting some issue with enumeration. Solution- Enumeration zipEntries = file.entries();

                                - Shiwang Kumar

                                  Try DigitalOcean for free

                                  Click below to sign up and get $200 of credit to try our products over 60 days!

                                  Sign up

                                  Join the Tech Talk
                                  Success! Thank you! Please check your email for further details.

                                  Please complete your information!

                                  Become a contributor for community

                                  Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                                  DigitalOcean Documentation

                                  Full documentation for every DigitalOcean product.

                                  Resources for startups and SMBs

                                  The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                                  Get our newsletter

                                  Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                                  New accounts only. By submitting your email you agree to our Privacy Policy

                                  The developer cloud

                                  Scale up as you grow — whether you're running one virtual machine or ten thousand.

                                  Get started for free

                                  Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                                  *This promotional offer applies to new accounts only.