File Input Output Java

/*
 *  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
  }
}