ZipUtil.java Source code

Java tutorial

Introduction

Here is the source code for ZipUtil.java

Source

/*
 *  Copyright (C) 2001, 2002 Robert MacGrogan
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 *
 * $Archive: SourceJammer$
 * $FileName: ZipUtil.java$
 * $FileID: 4327$
 *
 * Last change:
 * $AuthorName: Rob MacGrogan$
 * $Date: 4/23/03 5:23 PM$
 * $Comment: Replaced GPL header with LGPL header.$
 *
 * $KeyWordsOff: $
 */

/**
 * Title:        SourceJammer Library 1.0
 * Description:
 * Copyright:    Copyright (c) 2001
 * Company:      SourceJammer Project
 * @author Robert MacGrogan
 * @version 1.0
 */

import java.util.HashMap;
import java.util.zip.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.*;

/**
 * Static utility methods for zipping data.
 */
public class ZipUtil {

    public static final int ZIP_BUFFER_SIZE = 50;
    private static final int STREAM_BUFFER_SIZE = 1024;

    private ZipUtil() {
    }

    /**
     * Deflates the file and returns the deflated file.
     */
    public static byte[] zipByteArray(byte[] file) throws IOException {
        byte[] byReturn = null;
        Deflater oDeflate = new Deflater(Deflater.DEFLATED, false);
        oDeflate.setInput(file);
        oDeflate.finish();
        ByteArrayOutputStream oZipStream = new ByteArrayOutputStream();
        try {
            while (!oDeflate.finished()) {
                byte[] byRead = new byte[ZIP_BUFFER_SIZE];
                int iBytesRead = oDeflate.deflate(byRead);
                if (iBytesRead == byRead.length) {
                    oZipStream.write(byRead);
                } else {
                    oZipStream.write(byRead, 0, iBytesRead);
                }
            }
            oDeflate.end();
            byReturn = oZipStream.toByteArray();
        } finally {
            oZipStream.close();
        }
        return byReturn;
    }

    /**
     * Inflates a previously deflated file.
     */
    public static byte[] unzipByteArray(byte[] file) throws IOException {
        byte[] byReturn = null;

        Inflater oInflate = new Inflater(false);
        oInflate.setInput(file);

        ByteArrayOutputStream oZipStream = new ByteArrayOutputStream();
        try {
            while (!oInflate.finished()) {
                byte[] byRead = new byte[ZIP_BUFFER_SIZE];
                int iBytesRead = oInflate.inflate(byRead);
                if (iBytesRead == byRead.length) {
                    oZipStream.write(byRead);
                } else {
                    oZipStream.write(byRead, 0, iBytesRead);
                }
            }
            byReturn = oZipStream.toByteArray();
        } catch (DataFormatException ex) {
            throw new IOException("Attempting to unzip file that is not zipped.");
        } finally {
            oZipStream.close();
        }
        return byReturn;
    }

    /*
      public static void zipFileToFile(File flSource, File flTarget)
      throws IOException{
        Deflater oDeflate = new Deflater(Deflater.DEFLATED, false);
        
        FileInputStream stmFileIn = new FileInputStream(flSource);
        FileOutputStream stmFileOut = new FileOutputStream(flTarget);
        DeflaterOutputStream stmDeflateOut = new DeflaterOutputStream(stmFileOut, oDeflate);
        byte[] buffer = null;
        int iBufferSize = STREAM_BUFFER_SIZE;
        
        boolean bKeepZipping = true;
        try{
          while (bKeepZipping){
    buffer = new byte[iBufferSize];
    int iBytes = stmFileIn.read(buffer);
    if (iBytes == -1){
      bKeepZipping = false;
    }
    else{
      if (iBytes < iBufferSize){
        bKeepZipping = false;
        byte[] tmp = new byte[iBytes];
        for (int i = 0; i < iBytes; i++){
          tmp[i] = buffer[i];
        }
        buffer = tmp;
      }
      stmDeflateOut.write(buffer);
    }//end else some bytes returned.
          }//end while
        }//end try
        finally{
          stmDeflateOut.finish();
          stmDeflateOut.flush();
          stmDeflateOut.close();
          stmFileOut.close();
          stmFileIn.close();
        }
      }
    */

    public static void zipFileToFile(File flSource, File flTarget) throws IOException {
        Deflater oDeflate = new Deflater(Deflater.DEFLATED, false);

        FileInputStream stmFileIn = new FileInputStream(flSource);
        FileOutputStream stmFileOut = new FileOutputStream(flTarget);
        DeflaterOutputStream stmDeflateOut = new DeflaterOutputStream(stmFileOut, oDeflate);
        try {
            // FileUtil.inputStreamToOutputStream(stmFileIn, stmDeflateOut);
        } //end try
        finally {
            stmDeflateOut.finish();
            stmDeflateOut.flush();
            stmDeflateOut.close();
            stmFileOut.close();
            stmFileIn.close();
        }
    }

    public static void unzipFileToFile(File flSource, File flTarget) throws IOException {
        Inflater oInflate = new Inflater(false);
        FileInputStream stmFileIn = new FileInputStream(flSource);
        FileOutputStream stmFileOut = new FileOutputStream(flTarget);
        InflaterInputStream stmInflateIn = new InflaterInputStream(stmFileIn, oInflate);

        try {
            inflaterInputStmToFileOutputStm(stmInflateIn, stmFileOut);
        } //end try
        finally {
            stmFileOut.flush();
            stmFileOut.close();
            stmInflateIn.close();
            stmFileIn.close();
        }
    }

    private static void inflaterInputStmToFileOutputStm(InflaterInputStream stmIn, FileOutputStream stmOut)
            throws IOException {
        byte[] buffer = null;
        int iBufferSize = STREAM_BUFFER_SIZE;

        boolean bKeepStreaming = true;
        while (bKeepStreaming) {
            buffer = new byte[iBufferSize];
            int iBytes = stmIn.read(buffer);
            if (iBytes == -1) {
                bKeepStreaming = false;
            } else {
                if (iBytes < iBufferSize) {
                    bKeepStreaming = false;
                    byte[] tmp = new byte[iBytes];
                    for (int i = 0; i < iBytes; i++) {
                        tmp[i] = buffer[i];
                    }
                    buffer = tmp;
                }
                stmOut.write(buffer);
                //Override above test if available returns 1
                if (stmIn.available() == 1) {
                    bKeepStreaming = true;
                }
            } //end else some bytes returned.
        } //end while
    }

    /**
     * Checks passed-in file name against list of extensions not to zip. Returns
     * true if no matches, false if a match to file extension is found.
     */
    public static boolean canZip(String fileName) {
        boolean bCanZip = true;
        return bCanZip;
    }

    public static void main(String[] args) {
        try {
            File flSource = new File(args[0]);
            File flTarget = new File(args[1]);
            System.out.println("Unzipping file");

            unZipZipFileToLocation(flSource, flTarget);
            System.out.println("Done");

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void unZipZipFileToLocation(File zipFile, File targetDir) throws IOException {
        if (!targetDir.isDirectory()) {
            throw new Exception("Target is not a directory.");
        }
        FileInputStream flInStr = new FileInputStream(zipFile);
        try {
            ZipInputStream zis = new ZipInputStream(flInStr);
            try {
                ZipEntry entry = null;
                while ((entry = zis.getNextEntry()) != null) {
                    String name = entry.getName();
                    File newFile = new File(targetDir, name);
                    if (entry.isDirectory() && !newFile.exists()) {
                        newFile.mkdirs();
                    } else if (!entry.isDirectory()) {
                        if (newFile.exists()) {
                            newFile.delete();
                        }
                        File parentDir = newFile.getParentFile();
                        if (!parentDir.exists()) {
                            parentDir.mkdirs();
                        }
                        FileOutputStream stmOut = new FileOutputStream(newFile);
                        try {
                            simpleInputStreamToOutputStream(zis, stmOut);
                        } finally {
                            stmOut.close();
                        }
                    }
                } //end while.
            } finally {
                zis.close();
            }
        } finally {
            flInStr.close();
        }
    }

    private static void simpleInputStreamToOutputStream(InputStream stmIn, OutputStream stmOut) throws IOException {

        byte[] buffer = null;
        int iBufferSize = 4096;
        buffer = new byte[iBufferSize];

        boolean bKeepStreaming = true;
        while (bKeepStreaming) {
            int iBytes = stmIn.read(buffer);
            if (iBytes == -1) {
                bKeepStreaming = false;
            } else {
                stmOut.write(buffer, 0, iBytes);
            } //end else some bytes returned.
        } //end while
    }

}