读书人

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

发布时间: 2012-10-09 10:21:45 作者: rapoo

使用java对文件或文件夹进行压缩和加密
使用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要创建的文件路经 * @returnfile文件 * @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);elseoutBytes = 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) + "秒.");}}

读书人网 >编程

热点推荐