Friday, 20 July 2012

Create Zip File From Directory Recursively Using ZipOutputStream in Java

In this section , you will learn about how to create a zip file from directory recursively using java.util.zip. ZipOutputStream.


Before going through this section, please read the following articles:


Create zip file in Java

Recursively list files in Java

The complete source code is given below:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Zip {
 static final int BUFFER = 2048;

 /**
  * Command line arguments :
  *  argv[0]-----> Source directory.
  *  argv[1]-----> Destination zip file.
  **/
 public static void main(String[] args) {

  zipFile(args[0], args[1]);
 }

 public static void zipFile(String src, String dest) {

  FileOutputStream destination = null;
  try {
   destination = new FileOutputStream(dest);
  } catch (FileNotFoundException e) {
   System.out.println("Output directory does not exist..");
   e.printStackTrace();
  }

  /** Step: 1 ---> create a ZipOutputStream object. **/

  ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
    destination));

  /**
   * Step: 2 --->Open the source data and get a list of files from given
   * directory recursively.
   **/

  File source = new File(src);
  if (!source.exists()) {
   System.out.println("Input directory does not exist..");
   System.exit(0);
  }
  try {

   zipFilesRecursively(source.getParentFile(), source, out);

   /** Step: 6 --->close the output stream. **/

   out.close();
  } catch (IOException e) {

   e.printStackTrace();
  }

 }

 private static void zipFilesRecursively(File baseDir, File source,
   ZipOutputStream out) throws IOException {

  if (source.isFile()) {

   System.out.println("Adding File: "
     + baseDir.toURI().relativize(source.toURI()).getPath());

   FileInputStream fi = new FileInputStream(source);
   BufferedInputStream sourceStream = new BufferedInputStream(fi,
     BUFFER);

   /** Step: 3 ---> Create a zip entry for each file that is read. **/

   /**
    * relativize is used to to add a file to a zip, without including
    * the entire path from root.
    **/

   ZipEntry entry = new ZipEntry(baseDir.toURI()
     .relativize(source.toURI()).getPath());

   /** Step: 4 ---> Put the zip entry using putNextEntry. **/

   out.putNextEntry(entry);

   /**
    * Step: 5 ---> Write the data to the ZIP file and close the input
    * stream.
    **/

   int count;
   byte data[] = new byte[BUFFER];
   while ((count = sourceStream.read(data, 0, BUFFER)) != -1) {
    out.write(data, 0, count);
   }
   sourceStream.close();

  } else {

   if (source.listFiles() != null) {

    /** Add an empty folder to the zip **/

    if (source.listFiles().length == 0) {

     System.out.println("Adding Empty Folder: "
       + baseDir.toURI().relativize(source.toURI())
         .getPath());
     ZipEntry entry = new ZipEntry(baseDir.toURI()
       .relativize(source.toURI()).getPath()
       + File.separator);
     out.putNextEntry(entry);

    }

    for (File file : source.listFiles())

     zipFilesRecursively(baseDir, file, out);
   }
  }
 }
}

No comments:

Post a Comment