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