/*
* Created on 10.02.2005
*/
package jplagTutorial.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
/**
* Zips the given directory "dir" into a zip file in "dest"
* @param dir File denoting the directory to be zipped
* @param dest Name of the directory where the zipped file will be stored,
* which will be named dir.getName()+".zip"
* @return zipped file
*/
public static File zip(File dir, String dest) {
File zippedFile = new File(dest + "/" + dir.getName() + ".zip");
zipTo(dir, zippedFile);
return zippedFile;
}
/**
* Zips the given directory "dir" into the zip file "destFile".
* If "destFile" already exists, it will be overwritten
* @param dir Directory to be zipped
* @param destFile Destination file
*/
public static void zipTo(File dir, File destFile) {
FileOutputStream ops = null;
ZipOutputStream zos = null;
try {
ops = new FileOutputStream(destFile);
zos = new ZipOutputStream(ops);
zipDir(dir, zos, "");
} catch(FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(zos != null)
zos.close();
else if(ops != null)
ops.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
/**
* Recursively zips all files in "dir" and its subdirectories into the given
* ZipOutputStream "zos" using the given path prefix for their names
*/
private static void zipDir(File dir, ZipOutputStream zos, String prefix) {
File[] entries = dir.listFiles();
for(int i = 0; i < entries.length; i++) {
if(entries[i].isDirectory()) {
// generate directory entry
ZipEntry zi = new ZipEntry(prefix + "/" + entries[i].getName()
+ "/");
try {
zos.putNextEntry(zi);
zos.closeEntry();
} catch(IOException ioex) {
ioex.printStackTrace();
}
zipDir(entries[i], zos, prefix + "/" + entries[i].getName());
} else {
FileInputStream fis = null;
try {
fis = new FileInputStream(entries[i]);
ZipEntry zi = new ZipEntry(prefix + "/"
+ entries[i].getName());
zos.putNextEntry(zi);
copystream(fis, zos);
zos.closeEntry();
} catch(FileNotFoundException ex) {
ex.printStackTrace();
} catch(IOException ioex) {
ioex.printStackTrace();
} finally {
try {
if(fis != null)
fis.close();
} catch(Exception e) {}
}
}
}
}
/**
* Zips all files in "fileVector" to the zipfile "destFile".
* The pathnames of all files in fileVector must start with baseDir!
* @param fileVector Files to be zipped
* @param baseDir Root directory for this zip file
* @param destFile Destination file
*/
public static void zipFilesTo(Vector<File> fileVector, String baseDir,
File destFile) {
FileOutputStream ops = null;
ZipOutputStream zos = null;
int basedirlen = baseDir.length();
if(!baseDir.endsWith(File.separator)) basedirlen++;
try {
ops = new FileOutputStream(destFile);
zos = new ZipOutputStream(ops);
Iterator<File> iter = fileVector.iterator();
while(iter.hasNext()) {
File file = iter.next();
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
String name = file.getPath().substring(basedirlen);
name = name.replace('\\', '/'); // Zip uses '/' as separator
ZipEntry zi = new ZipEntry(name);
zos.putNextEntry(zi);
copystream(fis, zos);
zos.closeEntry();
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
if(fis != null)
fis.close();
} catch(Exception e) {}
}
}
} catch(FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(zos != null)
zos.close();
else if(ops != null)
ops.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
/**
* Unzips the zip file "file" into the directory "dest"
* @param file The zip file
* @param destDir Directory where the content of the zip file will be saved
*/
public static void unzip(File file, File destDir) {
destDir.mkdir();
try {
ZipFile zipFile = new ZipFile(file);
Enumeration entries = zipFile.entries();
while(entries.hasMoreElements()) {
ZipEntry ze = (ZipEntry) entries.nextElement();
if(ze.isDirectory())
(new File(destDir, ze.getName())).mkdir();
else {
// make sure directories exist in case the client
// didn't provide directory entries!
File f = new File(destDir, ze.getName());
(new File(f.getParent())).mkdirs();
FileOutputStream fos = null;
BufferedOutputStream bos = null;
InputStream in = null;
try {
fos = new FileOutputStream(f);
bos = new BufferedOutputStream(fos);
in = zipFile.getInputStream(ze);
copystream(in, bos);
} finally {
if(bos != null)
bos.close();
else if(fos != null)
fos.close();
if(in != null)
in.close();
}
}
}
} catch(IOException ioex) {
ioex.printStackTrace();
}
}
/**
* Copies the input stream to the output stream using a 1 kB buffer
* @throws IOException
*/
private static void copystream(InputStream in, OutputStream out)
throws IOException
{
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) >= 0)
out.write(buffer, 0, len);
}
public static void main(String[] args) {
// zip(new File("/home/bikiri/Desktop/jplag-old"),
// "/home/bikiri/Desktop");
unzip(new File("/home/bikiri/Desktop/emma.zip"),
new File("/home/bikiri/Desktop","unzipresult"));
}
}