您的位置:首页 > 编程语言 > Java开发

使用java对文件或文件夹进行压缩和加密

2012-11-08 11:07 585 查看
使用Java对文件或文件夹的压缩, 解压, 加密和解密. 加解密类型使用的是AES.

使用zip对文件或文件夹进行压缩, 解压缩:

import java.io.File;   
import java.io.FileInputStream;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.util.zip.ZipEntry;   
import java.util.zip.ZipInputStream;   
import java.util.zip.ZipOutputStream;   
  
/**  
 * 对文件或文件夹进行压缩和解压  
 *  
 */  
public class ZipUtil {   
    /**得到当前系统的分隔符*/  
//  private static String separator = System.getProperty("file.separator");   
  
    /**  
     * 添加到压缩文件中  
     * @param out  
     * @param f  
     * @param base  
     * @throws Exception  
     */  
    private void directoryZip(ZipOutputStream out, File f, String base) throws Exception {   
        // 如果传入的是目录   
        if (f.isDirectory()) {   
            File[] fl = f.listFiles();   
            // 创建压缩的子目录   
            out.putNextEntry(new ZipEntry(base + "/"));   
            if (base.length() == 0) {   
                base = "";   
            } else {   
                base = base + "/";   
            }   
            for (int i = 0; i < fl.length; i++) {   
                directoryZip(out, fl[i], base + fl[i].getName());   
            }   
        } else {   
            // 把压缩文件加入rar中   
            out.putNextEntry(new ZipEntry(base));   
            FileInputStream in = new FileInputStream(f);   
            byte[] bb = new byte[10240];   
            int aa = 0;   
            while ((aa = in.read(bb)) != -1) {   
                out.write(bb, 0, aa);   
            }   
            in.close();   
        }   
    }   
  
    /**  
     * 压缩文件  
     *   
     * @param zos  
     * @param file  
     * @throws Exception  
     */  
    private void fileZip(ZipOutputStream zos, File file) throws Exception {   
        if (file.isFile()) {   
            zos.putNextEntry(new ZipEntry(file.getName()));   
            FileInputStream fis = new FileInputStream(file);   
            byte[] bb = new byte[10240];   
            int aa = 0;   
            while ((aa = fis.read(bb)) != -1) {   
                zos.write(bb, 0, aa);   
            }   
            fis.close();   
            System.out.println(file.getName());   
        } else {   
            directoryZip(zos, file, "");   
        }   
    }   
  
    /**  
     * 解压缩文件  
     *   
     * @param zis  
     * @param file  
     * @throws Exception  
     */  
    private void fileUnZip(ZipInputStream zis, File file) throws Exception {   
        ZipEntry zip = zis.getNextEntry();   
        if (zip == null)   
            return;   
        String name = zip.getName();   
        File f = new File(file.getAbsolutePath() + "/" + name);   
        if (zip.isDirectory()) {   
            f.mkdirs();   
            fileUnZip(zis, file);   
        } else {   
            f.createNewFile();   
            FileOutputStream fos = new FileOutputStream(f);   
            byte b[] = new byte[10240];   
            int aa = 0;   
            while ((aa = zis.read(b)) != -1) {   
                fos.write(b, 0, aa);   
            }   
            fos.close();   
            fileUnZip(zis, file);   
        }   
    }   
       
    /**  
     * 根据filePath创建相应的目录  
     * @param filePath  
     * @return  
     * @throws IOException  
     */  
    private File mkdirFiles(String filePath) throws IOException{   
        File file = new File(filePath);   
        if(!file.getParentFile().exists()){   
            file.getParentFile().mkdirs();   
        }   
        file.createNewFile();   
           
        return file;   
    }   
  
    /**  
     * 对zipBeforeFile目录下的文件压缩,保存为指定的文件zipAfterFile  
     *   
     * @param zipBeforeFile     压缩之前的文件  
     * @param zipAfterFile      压缩之后的文件  
     */  
    public void zip(String zipBeforeFile, String zipAfterFile) {   
        try {   
               
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(mkdirFiles(zipAfterFile)));   
            fileZip(zos, new File(zipBeforeFile));   
            zos.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
  
    /**  
     * 解压缩文件unZipBeforeFile保存在unZipAfterFile目录下  
     *   
     * @param unZipBeforeFile       解压之前的文件  
     * @param unZipAfterFile        解压之后的文件  
     */  
    public void unZip(String unZipBeforeFile, String unZipAfterFile) {   
        try {   
            ZipInputStream zis = new ZipInputStream(new FileInputStream(unZipBeforeFile));   
            File f = new File(unZipAfterFile);   
            f.mkdirs();   
            fileUnZip(zis, f);   
            zis.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
}


使用AES对文件的加解密:

import java.io.File;   
import java.io.FileInputStream;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.security.Key;   
import java.security.SecureRandom;   
  
import javax.crypto.Cipher;   
import javax.crypto.KeyGenerator;   
import javax.crypto.SecretKey;   
import javax.crypto.spec.SecretKeySpec;   
  
/**  
 * 使用AES对文件进行加密和解密  
 *  
 */  
public class CipherUtil {   
    /**  
     * 使用AES对文件进行加密和解密  
     *   
     */  
    private static String type = "AES";   
  
    /**  
     * 把文件srcFile加密后存储为destFile  
     * @param srcFile     加密前的文件  
     * @param destFile    加密后的文件  
     * @param privateKey  密钥  
     * @throws GeneralSecurityException  
     * @throws IOException  
     */  
    public void encrypt(String srcFile, String destFile, String privateKey) throws GeneralSecurityException, IOException {   
        Key key = getKey(privateKey);   
        Cipher cipher = Cipher.getInstance(type + "/ECB/PKCS5Padding");   
        cipher.init(Cipher.ENCRYPT_MODE, key);   
  
        FileInputStream fis = null;   
        FileOutputStream fos = null;   
        try {   
            fis = new FileInputStream(srcFile);   
            fos = new FileOutputStream(mkdirFiles(destFile));   
  
            crypt(fis, fos, cipher);   
        } catch (FileNotFoundException e) {   
            e.printStackTrace();   
        } catch (IOException e) {   
            e.printStackTrace();   
        } finally {   
            if (fis != null) {   
                fis.close();   
            }   
            if (fos != null) {   
                fos.close();   
            }   
        }   
    }   
  
    /**  
     * 把文件srcFile解密后存储为destFile  
     * @param srcFile     解密前的文件  
     * @param destFile    解密后的文件  
     * @param privateKey  密钥  
     * @throws GeneralSecurityException  
     * @throws IOException  
     */  
    public void decrypt(String srcFile, String destFile, String privateKey) throws GeneralSecurityException, IOException {   
        Key key = getKey(privateKey);   
        Cipher cipher = Cipher.getInstance(type + "/ECB/PKCS5Padding");   
        cipher.init(Cipher.DECRYPT_MODE, key);   
  
        FileInputStream fis = null;   
        FileOutputStream fos = null;   
        try {   
            fis = new FileInputStream(srcFile);   
            fos = new FileOutputStream(mkdirFiles(destFile));   
  
            crypt(fis, fos, cipher);   
        } catch (FileNotFoundException e) {   
            e.printStackTrace();   
        } catch (IOException e) {   
            e.printStackTrace();   
        } finally {   
            if (fis != null) {   
                fis.close();   
            }   
            if (fos != null) {   
                fos.close();   
            }   
        }   
    }   
  
    /**  
     * 根据filePath创建相应的目录  
     * @param filePath      要创建的文件路经  
     * @return  file        文件  
     * @throws IOException  
     */  
    private File mkdirFiles(String filePath) throws IOException {   
        File file = new File(filePath);   
        if (!file.getParentFile().exists()) {   
            file.getParentFile().mkdirs();   
        }   
        file.createNewFile();   
  
        return file;   
    }   
  
    /**  
     * 生成指定字符串的密钥  
     * @param secret        要生成密钥的字符串  
     * @return secretKey    生成后的密钥  
     * @throws GeneralSecurityException  
     */  
    private static Key getKey(String secret) throws GeneralSecurityException {   
        KeyGenerator kgen = KeyGenerator.getInstance(type);   
        kgen.init(128, new SecureRandom(secret.getBytes()));   
        SecretKey secretKey = kgen.generateKey();   
        return secretKey;   
    }   
  
    /**  
     * 加密解密流  
     * @param in        加密解密前的流  
     * @param out       加密解密后的流  
     * @param cipher    加密解密  
     * @throws IOException  
     * @throws GeneralSecurityException  
     */  
    private static void crypt(InputStream in, OutputStream out, Cipher cipher) throws IOException, GeneralSecurityException {   
        int blockSize = cipher.getBlockSize() * 1000;   
        int outputSize = cipher.getOutputSize(blockSize);   
  
        byte[] inBytes = new byte[blockSize];   
        byte[] outBytes = new byte[outputSize];   
  
        int inLength = 0;   
        boolean more = true;   
        while (more) {   
            inLength = in.read(inBytes);   
            if (inLength == blockSize) {   
                int outLength = cipher.update(inBytes, 0, blockSize, outBytes);   
                out.write(outBytes, 0, outLength);   
            } else {   
                more = false;   
            }   
        }   
        if (inLength > 0)   
            outBytes = cipher.doFinal(inBytes, 0, inLength);   
        else  
            outBytes = cipher.doFinal();   
        out.write(outBytes);   
    }   
}


对文件或文件夹进行压缩解压加密解密:

import java.io.File;   
import java.util.UUID;   
  
public class ZipCipherUtil {   
    /**  
     * 对目录srcFile下的所有文件目录进行先压缩后加密,然后保存为destfile  
     *   
     * @param srcFile  
     *            要操作的文件或文件夹  
     * @param destfile  
     *            压缩加密后存放的文件  
     * @param keyfile  
     *            密钥  
     */  
    public void encryptZip(String srcFile, String destfile, String keyStr) throws Exception {   
        File temp = new File(UUID.randomUUID().toString() + ".zip");   
        temp.deleteOnExit();   
        // 先压缩文件   
        new ZipUtil().zip(srcFile, temp.getAbsolutePath());   
        // 对文件加密   
        new CipherUtil().encrypt(temp.getAbsolutePath(), destfile, keyStr);   
        temp.delete();   
    }   
  
    /**  
     * 对文件srcfile进行先解密后解压缩,然后解压缩到目录destfile下  
     *   
     * @param srcfile  
     *            要解密和解压缩的文件名   
     * @param destfile  
     *            解压缩后的目录  
     * @param publicKey  
     *            密钥  
     */  
    public void decryptUnzip(String srcfile, String destfile, String keyStr) throws Exception {   
        File temp = new File(UUID.randomUUID().toString() + ".zip");   
        temp.deleteOnExit();   
        // 先对文件解密   
        new CipherUtil().decrypt(srcfile, temp.getAbsolutePath(), keyStr);   
        // 解压缩   
        new ZipUtil().unZip(temp.getAbsolutePath(),destfile);   
        temp.delete();   
    }   
       
    public static void main(String[] args) throws Exception {   
        long l1 = System.currentTimeMillis();   
           
        //加密   
//      new ZipCipherUtil().encryptZip("d:\\test\\111.jpg", "d:\\test\\photo.zip", "12345");   
        //解密   
        new ZipCipherUtil().decryptUnzip("d:\\test\\photo.zip", "d:\\test\\111_1.jpg", "12345");   
           
        long l2 = System.currentTimeMillis();   
        System.out.println((l2 - l1) + "毫秒.");   
        System.out.println(((l2 - l1) / 1000) + "秒.");   
    }   
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: