Mega Code Archive

 
Categories / Java / File Input Output
 

Zip unzip byte array

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