zip格式,文件的压缩与解压

package com.ky.fuse.report.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class ZipUtil {
    /** 
     *  设置缓冲值
     */
    static final int BUFFER = 8192;
    private static final String ALGORITHM = "PBEWithMD5AndDES";

    public static void zip(String zipFileName, String inputFile, String pwd)
            throws Exception {
        zip(zipFileName, new File(inputFile), pwd);
    }

    /**
     * 
     * 功能描述:压缩指定路径下的所有文件 
     * @param zipFileName 压缩文件名(带有路径) 
     * @param inputFile 指定压缩文件夹 
     * @return 
     * @throws Exception
     */
    public static void zip(String zipFileName, String inputFile)
            throws Exception {
        zip(zipFileName, new File(inputFile), null);
    }

    /**
     *  功能描述:压缩文件对象 
     *  @param zipFileName 压缩文件名(带有路径) 
     *  @param inputFile 文件对象 
     *  @return
     *  @throws Exception
     */
    public static void zip(String zipFileName, File inputFile, String pwd)
            throws Exception {
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
                zipFileName));
        zip(out, inputFile, "", pwd);
        out.close();
    }

    /**
     * @param out 压缩输出流对象 
     * @param file 
     * @param base 
     * @throws Exception 
     *   
    */
    public static void zip(ZipOutputStream outputStream, File file,
            String base, String pwd) throws Exception {
        if (file.isDirectory()) {
            File[] fl = file.listFiles();
            outputStream.putNextEntry(new ZipEntry(base + "/"));
            base = base.length() == 0 ? "" : base + "/";
            for (int i = 0; i < fl.length; i++) {
                zip(outputStream, fl[i], base + fl[i].getName(), pwd);
            }
        } else {
            outputStream.putNextEntry(new ZipEntry(base));
            FileInputStream inputStream = new FileInputStream(file);
            // 普通压缩文件
            if (pwd == null || pwd.trim().equals("")) {
                int b;
                while ((b = inputStream.read()) != -1) {
                    outputStream.write(b);
                }
                inputStream.close();
            }
            // 给压缩文件加密
            else {
                PBEKeySpec keySpec = new PBEKeySpec(pwd.toCharArray());
                SecretKeyFactory keyFactory = SecretKeyFactory
                        .getInstance(ALGORITHM);
                SecretKey passwordKey = keyFactory.generateSecret(keySpec);
                byte[] salt = new byte[8];
                Random rnd = new Random();
                rnd.nextBytes(salt);
                int iterations = 100;
                PBEParameterSpec parameterSpec = new PBEParameterSpec(salt,
                        iterations);
                Cipher cipher = Cipher.getInstance(ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, passwordKey, parameterSpec);
                outputStream.write(salt);
                byte[] input = new byte[64];
                int bytesRead;
                while ((bytesRead = inputStream.read(input)) != -1) {
                    byte[] output = cipher.update(input, 0, bytesRead);
                    if (output != null) {
                        outputStream.write(output);
                    }
                }
                byte[] output = cipher.doFinal();
                if (output != null) {
                    outputStream.write(output);
                }
                inputStream.close();
                outputStream.flush();
                outputStream.close();
            }
        }
        //file.delete();
    }

    public static void unzip(String zipFileName, String outputDirectory)
            throws Exception {
        ZipInputStream inputStream = new ZipInputStream(new FileInputStream(
                zipFileName));
        unzip(inputStream, outputDirectory, null);
    }

    /**
     * 功能描述:将压缩文件解压到指定的文件目录下
     * @param zipFileName 压缩文件名称(带路径) 
     * @param
     * outputDirectory 指定解压目录 
     * @return 
     * @throws Exception
     */
    public static void unzip(String zipFileName, String outputDirectory,
            String pwd) throws Exception {
        ZipInputStream inputStream = new ZipInputStream(new FileInputStream(
                zipFileName));
        unzip(inputStream, outputDirectory, pwd);
    }

    public static void unzip(File zipFile, String outputDirectory, String pwd)
            throws Exception {
        ZipInputStream inputStream = new ZipInputStream(new FileInputStream(
                zipFile));
        unzip(inputStream, outputDirectory, pwd);
    }

    public static void unzip(ZipInputStream inputStream,
            String outputDirectory, String pwd) throws Exception {
        ZipEntry zipEntry = null;
        FileOutputStream outputStream = null;
        try {
            while ((zipEntry = inputStream.getNextEntry()) != null) {
                if (zipEntry.isDirectory()) {
                    String name = zipEntry.getName();
                    name = name.substring(0, name.length() - 1);
                    File file = new File(outputDirectory + File.separator
                            + name);
                    file.mkdir();
                } else {
                    File file = new File(outputDirectory + File.separator
                            + zipEntry.getName());
                    file.createNewFile();
                    outputStream = new FileOutputStream(file);
                    // 普通解压缩文件
                    if (pwd == null || pwd.trim().equals("")) {
                        int b;
                        while ((b = inputStream.read()) != -1) {
                            outputStream.write(b);
                        }
                        outputStream.close();
                    }
                    // 解压缩加密文件
                    else {
                        PBEKeySpec keySpec = new PBEKeySpec(pwd.toCharArray());
                        SecretKeyFactory keyFactory = SecretKeyFactory
                                .getInstance(ALGORITHM);
                        SecretKey passwordKey = keyFactory
                                .generateSecret(keySpec);
                        byte[] salt = new byte[8];
                        inputStream.read(salt);
                        int iterations = 100;
                        PBEParameterSpec parameterSpec = new PBEParameterSpec(
                                salt, iterations);
                        Cipher cipher = Cipher.getInstance(ALGORITHM);
                        cipher.init(Cipher.DECRYPT_MODE, passwordKey,
                                parameterSpec);
                        byte[] input = new byte[64];
                        int bytesRead;
                        while ((bytesRead = inputStream.read(input)) != -1) {
                            byte[] output = cipher.update(input, 0, bytesRead);
                            if (output != null) {
                                outputStream.write(output);
                            }
                        }
                        byte[] output = cipher.doFinal();
                        if (output != null) {
                            outputStream.write(output);
                        }
                        outputStream.flush();
                        outputStream.close();
                    }
                }
            }
            inputStream.close();
        } catch (IOException ex) {
            throw new Exception("解压读取文件失败");
        } catch (Exception ex) {
            throw new Exception("解压文件密码不正确");
        } finally {
            inputStream.close();
            outputStream.flush();
            outputStream.close();
        }
    }
    public static void main(String args[]){
        try {
            ZipUtil.zip("E:\\222\\111.zip", new File("E:\\111\\"),null);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
 

你可能感兴趣的:(zip,压缩,解压)