`
hao0610
  • 浏览: 127484 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用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		要创建的文件路经
	 * @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) + "秒.");
	}
}
分享到:
评论
1 楼 fengzy001 2014-07-30  
兄弟你这个压缩后的文件使用系统的zip或winrar解压不了啊

相关推荐

    java 操作Zip文件(压缩、解压、加密).zip

    Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...

    Java实现对文件夹的加密码压缩(绝对可用)

    JAVA实现对文件夹“加密码压缩” 此资源解压后为一个文件夹,就是一个package包 (压缩后为Zip文件) 无需导入任何个人jar包 压缩后效果等同于用winrar给压缩包加密码 时间紧迫,暂时存在中文文件夹名称乱码问题 不...

    如何使用文件夹加密 如何使用文件夹加密

    EFS是Windows操作系统自带的一项功能,用于对NTFS文件系统中的文件和文件夹进行透明加密。以下是使用EFS加密文件夹的步骤: 1. 选择要加密的文件夹,右键点击,选择“属性”。 2. 在“属性”窗口中,切换到“高级”...

    java 压缩加密项目

    这个"java 压缩加密项目"是一个实际的应用实例,它展示了如何使用Java处理文件的压缩和加密操作,特别是在Web环境中,如jsp和servlet的使用。项目的开发环境是JDK 1.5,IDE为Myeclipse 8.5,并且已经在Tomcat 6...

    java代码实现单个或多个文件压缩成rar包

    java代码实现单个或多个文件压缩成rar包,本地要安装winRar插件。

    基于JAVA文件压缩与解压缩实践的毕业设计,该系统将有助于用户方便地进行文件传输和存储 同时,该系统将提供加密解密功能,保护用户

    3. 加密压缩:对压缩文件进行加密保护。 4. 解密解压:对加密的压缩文件进行解密解压。 ## 设计思路 本系统将基于JAVA语言开发,使用JAVA自带的Zip文件压缩与解压缩类库,同时结合JAVA的加密解密类库,实现文件...

    Java/Android 加密解密压缩文件夹

    主要实现了将文件夹压缩成带密码的zip格式文件,并提供解密方法。主要的两个函数分别为EncryptZipFile和DecryptZipFile函数。 /** * 生成带密码的ZIP压缩文件 * @param zipDir 待压缩文件路径 * @param ...

    文件加密压缩源码EncryptZip

    Java提供了一个名为`java.util.zip`的内置库,可以方便地对文件或文件夹进行压缩和解压缩操作。 EncryptZip项目就是基于Java的ZIP压缩库实现的,它增加了加密功能,使得压缩文件在传输和存储过程中更加安全。加密...

    支持多文件及文件夹压缩工具

    用户则可以利用它们来节省硬盘空间,或者对重要文件进行加密备份。 总之,支持多文件及文件夹压缩的工具是现代数字生活中非常实用的功能,它结合了高效的数据压缩算法和方便的文件管理能力,极大地提高了我们处理...

    Android-Android端zip压缩与解压支持使用密码对单文件多文件文件夹进行压缩以及解压操作

    `Zip4j`库提供了简单易用的接口,可以方便地进行文件和文件夹的压缩与解压,而且支持设置密码保护,增加了数据的安全性。 以下是使用`Zip4j`进行压缩的基本步骤: 1. **添加依赖**:在项目的build.gradle文件中...

    java文件和文件夹操作大全

    ### Java文件和文件夹操作大全:深度解析与实践指南 #### 一、创建文件夹与文件 在Java中,创建文件夹与文件是基础而重要的功能。通过`java.io.File`类,我们可以轻松实现这些操作。 **创建文件夹示例**: ```...

    JAVA压缩包加密解密方法及jar包

    在Java编程环境中,对文件进行压缩和加密是常见的需求,特别是在数据存储和传输时为了减小体积和保证安全。本文将详细介绍如何使用Java实现文件的压缩、加密以及解压缩,并探讨涉及的jar包和源码。 首先,我们需要...

    zip4j-java加密压缩

    在Java编程中,处理文件的压缩和解压是一项常见的任务,而zip4j库提供了一种便捷的方式,它支持文件和文件夹的加密压缩以及解压操作。zip4j不仅简单易用,还提供了强大的功能,包括对ZIP文件的高级加密,使得数据在...

    文件压缩解压缩

    例如,在自动化脚本、备份程序或文件管理系统中,都可以利用此类工具进行数据压缩和传输。不过,需要注意的是,虽然这类工具简化了操作,但在处理大量数据或高度敏感信息时,还需要考虑安全性和性能优化问题。

    java编写的命令行文件/文件夹管理程序

    3. **文件操作**:程序能对文件进行复制、删除、重命名等操作。复制和移动文件可以使用`java.nio.Files.copy()`或`Files.move()`方法;删除文件则用`Files.delete()`;重命名可通过`Files.rename()`。 4. **文件夹...

    常用的java工具类:Date和String类型互转,获取想要格式的String类型的日期时间、java导出数据到Excel、http文件下载、HMAC-MD5加密、3DES加密、MD5加密、读写txt文件、zip解压缩文件、文件夹

    一些常用的java工具类:Date和String类型互转,获取想要格式的String类型的日期时间、java导出数据到Excel、http文件下载、HMAC-MD5加密、3DES加密、MD5加密、读写txt文件、zip解压缩文件、文件夹等

    文件夹zip压缩

    2. 文件夹压缩:当你需要压缩一个包含多个文件和子文件夹的目录时,ZIP格式非常适合。通过压缩整个文件夹,可以快速地将大量数据整理并减小体积。在编程中,通常会使用特定的库或API来实现这个功能,例如Java中的`...

    java文件资源管理系统

    可以使用AES、DES等对称加密算法或RSA、DSA等非对称加密算法对文件内容进行加密和解密。 开发这样的系统,还需要考虑错误处理、权限管理、性能优化以及用户友好的界面设计。错误处理确保在出现异常时能够恢复或给出...

    解压缩加密工具类SSSS

    SSSS 这样的工具不仅具备基本的解压缩功能,还能对文件进行加密,确保只有拥有正确密钥的人才能访问文件内容。 在安全方面,SSSS 可能采用了多种加密算法。常见的有AES(Advanced Encryption Standard)加密,这是...

    java RSA加解密 zip加解密, js MD5 SHA1 RSA加密

    ZIP是一种广泛使用的文件压缩格式,支持对文件或文件夹进行压缩。在Java中,我们可以使用`java.util.zip`包下的`ZipOutputStream`和`ZipInputStream`来进行文件的压缩和解压。如果需要加密,可以使用`ZipEntry`的`...

Global site tag (gtag.js) - Google Analytics