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