package com.pru.zip.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import com.pru.zip.util.AESEncrypter;
import com.pru.zip.util.AESEncrypterBC;
import net.sf.sevenzipjbinding.ExtractOperationResult;
import net.sf.sevenzipjbinding.ISequentialOutStream;
import net.sf.sevenzipjbinding.ISevenZipInArchive;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
import net.sf.sevenzipjbinding.simple.ISimpleInArchive;
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
public class ZipUtil
{
/*
* This method is used to write the contents from a zip file to a file
*
* @param file of type {@link File}
*
* @param zipIn of type {@link ZipInputStream}
*/
private static void writeFile(File file, ZipInputStream zipIn)
{
try
{
OutputStream outStream = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len;
while ((len = zipIn.read(buff)) > 0)
{
outStream.write(buff, 0, len);
}
outStream.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* This method is used to extract the zip file to a destination directory
*
* @param srcZipfile
* of type {@link File} indicating the source zip file
*
* @param destinationDir
* of type {@link File} indicating the destination
*
* directory where the zip file will be extracted.
*
* @throws IOException
*/
private static void extract(File srcZipfile, File destinationDir)
throws IOException
{
ZipInputStream zipIn = null;
try
{
zipIn = new ZipInputStream(new FileInputStream(srcZipfile));
ZipEntry entry = null;
while ((entry = zipIn.getNextEntry()) != null)
{
String outFilename = entry.getName();
// CIO, CTO & Developer Resources
if (!new File(destinationDir, outFilename).getParentFile()
.exists())
new File(destinationDir, outFilename).getParentFile()
.mkdirs();
if (!entry.isDirectory())
writeFile(new File(destinationDir, outFilename), zipIn);
}
System.out.println("Zip file extracted successfully...");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (zipIn != null)
{
zipIn.close();
}
}
}
/**
* This method is used to zip or compress a directory to create a zip file.
*
* @param directory
* of type String indicating the source directory to be zipped
*
* @param zos
* of type {@link ZipOutputStream}
*
* @param path
* of type String indicating the path
*
* @throws IOException
*/
private static void compressDir(String directory, ZipOutputStream zos,
String path) throws IOException {
File zipDir = new File(directory);
String[] dirList = zipDir.list();
byte[] readBuffer = new byte[2156];
int bytesIn = 0;
for (int i = 0; i < dirList.length; i++)
{
File f = new File(zipDir, dirList[i]);
if (f.isDirectory())
{
String filePath = f.getPath();
compressDir(filePath, zos, path + f.getName() + "/");
continue;
}
FileInputStream fis = new FileInputStream(f);
try
{
ZipEntry anEntry = new ZipEntry(path + f.getName());
zos.putNextEntry(anEntry);
bytesIn = fis.read(readBuffer);
while (bytesIn != -1)
{
zos.write(readBuffer, 0, bytesIn);
bytesIn = fis.read(readBuffer);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
fis.close();
}
}
}
/**
* This method is used to zip a directory
*
* @param dirName
* of type String indicating the path of the directory to be
* zipped
*
* @param zipFileName
* of type String indicating the file name for the zip file
*/
public static void zipDir(String dirName, String zipFileName)
{
if (zipFileName == null)
{
File tempFile = new File(dirName);
zipFileName = tempFile.getAbsoluteFile().getParent()
+ File.separator + tempFile.getName() + ".zip";
}
try
{
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
zipFileName));
compressDir(dirName, zos, new File(dirName).getName()
+ File.separator);
zos.close();
}
catch (NullPointerException npe)
{
npe.printStackTrace();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException ie)
{
ie.printStackTrace();
}
}
/**
* This method is used to create a password protected zip file.
*
* @param fileName
* of type String indicating the name of the file to be
* zipped
*
* @param zipFileName
* of type String indicating the name of the zip file to be
* created
*
* @param password
* of type String indicating the password
* @throws IOException
*/
public static void zipFileWithPassword(String fileName, String zipFileName, String password) throws IOException{
AESEncrypter encrypter = new AESEncrypterBC();
File inFile = new File(fileName);
File encFile = new File(zipFileName);
AesZipFileEncrypter enc = new AesZipFileEncrypter(encFile,encrypter);
enc.addAll(inFile, password);
enc.close();
}
public static void zipOneFileWithPassword(String fileName, String zipFileName, String password) throws IOException{
AESEncrypter encrypter = new AESEncrypterBC();
File inFile = new File(fileName);
File encFile = new File(zipFileName);
AesZipFileEncrypter enc = new AesZipFileEncrypter(encFile,encrypter);
enc.add(inFile, password);
//enc.add(zipEntry, zipData, password);
enc.close();
}
public static void zipEntryFileWithPassword(String fileName, String zipFileName, String password) throws IOException{
AESEncrypter encrypter = new AESEncrypterBC();
File inFile = new File(fileName);
File encFile = new File(zipFileName);
AesZipFileEncrypter enc = new AesZipFileEncrypter(encFile,encrypter);
//enc.add(inFile, password);
// ExtZipEntry zipEntry = new ExtZipEntry("");
// enc.add(zipEntry, new ExtZipOutputStream(encFile), password);
// enc.add(zipEntry, zipData)
enc.add(inFile, zipFileName, password);
enc.close();
}
/**
* This method is used to create a password protected zip file.
*
* @param fileName
* of type String indicating the name of the file to be
* zipped
*
* @param zipFileName
* of type String indicating the name of the zip file to be
* created
*
* @param password
* of type String indicating the password
* @throws IOException
*/
public static void applyFileWithPassword(String fileName, String zipFileName, String password) throws IOException{
AESEncrypter encrypter = new AESEncrypterBC();
File inFile = new File(fileName);
File encFile = new File(zipFileName);
AesZipFileEncrypter enc = new AesZipFileEncrypter(encFile,encrypter);
//enc.zipAndEncrypt(inFile, password);
//enc.close();
}
/**
* This method is used to unzip a zip file to a directory
*
* @param sourceZipFile
* of type String indicating the source zip file
*
* @param destinationDir
* of type String indicating the destination directory
*
* where the zip file will be extracted.
*/
public static void unzipDir(String sourceZipFile, String destinationDir)
{
try
{
extract(new File(sourceZipFile), new File(destinationDir));
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* This method is used to unzip a password protected zip file.
*
* @param sourceZipFile
* of type String indicating the source zip file
*
* @param destinationDir
* of type String indicating the directory where
*
* the zip file will be extracted.
*
* @param password
* of type String indicating the password.
* @throws Exception
*/
public static void unzipDirWithPassword(final String sourceZipFile,
final String destinationDir, final String password) throws Exception
{
File desDir= new File(destinationDir);
if(!desDir.exists()){
desDir.mkdir();
}
RandomAccessFile randomAccessFile = null;
ISevenZipInArchive inArchive = null;
try
{
randomAccessFile = new RandomAccessFile(sourceZipFile, "r");
inArchive = SevenZip.openInArchive(null, // autodetect archive type
new RandomAccessFileInStream(randomAccessFile));
// Getting simple interface of the archive inArchive
ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();
for (final ISimpleInArchiveItem item : simpleInArchive
.getArchiveItems())
{
final int[] hash = new int[] { 0 };
if (!item.isFolder())
{
ExtractOperationResult result;
result = item.extractSlow(new ISequentialOutStream()
{
public int write(final byte[] data)
throws SevenZipException
{
try
{
if (item.getPath().indexOf(File.separator) > 0)
{
String path = destinationDir
+ File.separator
+ item.getPath().substring(
0,
item.getPath().lastIndexOf(
File.separator));
File folderExisting = new File(path);
if (!folderExisting.exists())
new File(path).mkdirs();
}
// update by william on 2014-4-02 for fix the file not existing
File outFile= new File(destinationDir + File.separator+ item.getPath());
if(!outFile.exists()){
if(!outFile.getParentFile().mkdirs()){
System.out.println("Create parent folder failed");
}
if(!outFile.createNewFile()){
System.out.println("Create file failed");
}
}
OutputStream out = new FileOutputStream(
destinationDir + File.separator
+ item.getPath());
out.write(data);
out.close();
}
catch (Exception e)
{
e.printStackTrace();
}
hash[0] |= Arrays.hashCode(data);
return data.length; // Return amount of proceed data
}
}, password); // / password.
if (result == ExtractOperationResult.OK)
{
System.out.println(String.format("%9X | %s",
hash[0], item.getPath()));
}
else
{
System.err.println("Error extracting item: " + result);
}
}else{
System.out.println(" out put folder.....");
}
}
}
catch (Exception e)
{
e.printStackTrace();
throw new Exception(e);
}
finally
{
if (inArchive != null)
{
try
{
inArchive.close();
}
catch (SevenZipException e)
{
System.err.println("Error closing archive: " + e);
e.printStackTrace();
}
}
if (randomAccessFile != null)
{
try
{
randomAccessFile.close();
}
catch (IOException e)
{
System.err.println("Error closing file: " + e);
e.printStackTrace();
throw new Exception(e);
}
}
}
}
/**
*
* @param backupFile
* @param srcDir
* @param userFolder current user
* @throws IOException
*/
public void zipByFolder(File backupFile, File srcDir, String userFolder) throws Exception {
ZipOutputStream zipOut = null;
try {
zipOut = new ZipOutputStream(new FileOutputStream(backupFile));
zipFolder(zipOut,srcDir,userFolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new Exception(e);
} finally {
if (null != zipOut) {
try {
zipOut.close();
} catch (IOException e) {
}
}
}
}
/**
* zip folder srcDir and it's sub foder to zipOutput
*
* @param zipOutput
* @param srcDir
* @param userFolder current user
* @throws IOException
*/
private void zipFolder(ZipOutputStream zipOutput, File srcDir, String userFolder) throws IOException {
String[] children = srcDir.list();
if (null != children) {
for (int p = 0; p < children.length; p++) {
File f = new File(srcDir + "/" + children[p]);
String filePath = f.getPath().substring(userFolder.length());
if (f.isDirectory()) {
zipFolder(zipOutput, f, userFolder);
} else {
zipOutput.putNextEntry(new ZipEntry(filePath));
FileInputStream fis = new FileInputStream(f);
byte[] buf = new byte[1024];
int i = 0;
while ((i = fis.read(buf)) != -1) {
zipOutput.write(buf, 0, i);
}
zipOutput.closeEntry();
fis.close();
//currentProgress += 1;
}
}
}
}
}
package com.pru.zip.util;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.zip.DataFormatException;
public class TestZip {
/**
* Zip Encrypt and Decrypt
* @author weiliang.ouyang
*
*/
public static void main(String[] args) {
ZipUtil z= new ZipUtil();
// zip folder (c://test) be a zip file
// there is a bug if the folder only one file
try {
// do not use this
//z.zipByFolder(new File("D://New folder//zip//2014//04//aaa.zip"), new File("D://New folder//zip//2014//04//test"), "D://New folder//zip//2014//04//test");
// the correct one below
z.zipByFolder(new File("D:\\New folder\\zip\\2014\\04\\aaa.zip"), new File("D:\\New folder\\zip\\2014\\04\\test"), "D:\\New folder\\zip\\2014\\04\\test");
} catch (Exception e1) {
e1.printStackTrace();
}
try {
// Encrypt Zip file(c:\\aaa.zip) with a password, eg:
z.zipFileWithPassword("D:\\New folder\\zip\\2014\\04\\aaa.zip", "D:\\New folder\\zip\\2014\\04\\bbb.zip", "3");
//z.zipOneFileWithPassword("c:\\test2\\ttttt.pdf", "c:\\44444.zip", "3");
} catch (IOException e) {
}
// Decrypt Zip() file with a password, eg:
try {
z.unzipDirWithPassword("D:\\New folder\\zip\\2014\\04\\bbb.zip", "D:\\New folder\\zip\\2014\\04\\ccc", "3");
} catch (Exception e) {
e.printStackTrace();
}
}
}