使用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) + "秒.");
}
}
分享到:
相关推荐
JAVA实现对文件夹“加密码压缩” 此资源解压后为一个文件夹,就是一个package包 (压缩后为Zip文件) 无需导入任何个人jar包 压缩后效果等同于用winrar给压缩包加密码 时间紧迫,暂时存在中文文件夹名称乱码问题 不...
java代码实现单个或多个文件压缩成rar包,本地要安装winRar插件。
3. 加密压缩:对压缩文件进行加密保护。 4. 解密解压:对加密的压缩文件进行解密解压。 ## 设计思路 本系统将基于JAVA语言开发,使用JAVA自带的Zip文件压缩与解压缩类库,同时结合JAVA的加密解密类库,实现文件...
主要实现了将文件夹压缩成带密码的zip格式文件,并提供解密方法。主要的两个函数分别为EncryptZipFile和DecryptZipFile函数。 /** * 生成带密码的ZIP压缩文件 * @param zipDir 待压缩文件路径 * @param ...
java编写的命令行文件管理程序,可对文件或文件夹进行复制,删除,重命名,加密解密,压缩解压缩等功能
一些常用的java工具类:Date和String类型互转,获取想要格式的String类型的日期时间、java导出数据到Excel、http文件下载、HMAC-MD5加密、3DES加密、MD5加密、读写txt文件、zip解压缩文件、文件夹等
基于java swing 开发的文件管理器: 采用苹果 ios 主题风格,支持环形进度条显示cpu利用率 GUI文件管理系统 ...5、实现指定文件和文件夹的压缩。 6、实现压缩文件的解压。 7、文件管理器具有图形界面。
支持文件,文件夹的加密压缩及解压
当解压合并结束后,程序将PROVINCE_DIR路径下的文件移动到DONE_FILE_PATH下,并且删除PROVINCE_DIR跟UN_ZIP_PATH下文件,这样保证程序每次运行PROVINCE_DIR文件夹下的文件跟UN_ZIP_PATH下的文件都是最新未处理过的,...
运行方法: 运行\src\waves\chj包下面的FileManager.java文件就可以了。 没积分的朋友: ...5、实现指定文件和文件夹的压缩。 6、实现压缩文件的解压。 7、文件管理器具有图形界面。 建议使用Eclipse打开项目。
java 写的一个工具类可以用来解压缩zip,rar文件到指定的文件夹下
运用面向对象程序设计思想,基于Java文件管理和I/O框架,实现基于图形界面的GUI文件管理器。 二、实验项目内容 1、实现文件夹创建、删除、进入。 2、实现当前文件夹下的内容罗列。 3、实现文件拷贝和文件夹拷贝...
17.以一个文件夹的框架在另一个目录创建文件夹和空文件 18.复制文件 19.复制一个文件夹下所有的文件到另一个目录 20.提取扩展名 21.提取文件名 22.提取文件路径 23.替换扩展名 24.追加路径 25.移动文件 26....
JAVA 文件夹压缩解压,并使用AES加密源代码,带ant.jar包
1、实现文件夹创建、删除、进入。 2、实现当前文件夹下的内容罗列... 4、实现指定文件的加密和解密。 5、实现多个文件的压缩和解压缩。 6、实现一个大文件的分割和合并。 7、实现把项目导出为可执行的*.jar文件
java 实现指定目录下的文件打包zip格式 并指定存放zip包
Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
实现文件夹创建、删除、进入。实现当前文件夹下的内容显示。 实现文件复制功能。实现指定文件和文件夹的压缩、解压、加密等功能。
Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...