ZIP project

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();
		}

	}

}

 

 

你可能感兴趣的:(project)