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