import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class zip压缩与解压 {
public static void main(String[] args) {
// compression("C:\\Users\\puban\\Desktop\\b.zip", new File("C:\\Users\\puban\\Desktop\\设计稿"));
deCompression("C:\\\\Users\\\\puban\\\\Desktop\\\\b.zip", "C:\\Users\\puban\\Desktop\\java");
}
// 文件夹和文件压缩
/**
* @param zipFilePath 压缩后的文件路径;
* @param targetFile 需要压缩的文件
*/
public static void compression(String zipFilePath, File targetFile) {
try {
if (zipFilePath == null || targetFile == null) return;
// zip输出流:写入文件
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFilePath));
// 设置压缩等级
zipOutputStream.setLevel(1);
// 加入缓存
BufferedOutputStream bos = new BufferedOutputStream(zipOutputStream); // 加入到缓存
zip(zipOutputStream, targetFile, targetFile.getName(), bos);
// 关闭流
bos.close();
zipOutputStream.close();
System.out.println("压缩成功");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param zipOutputStream zip输出流
* @param targetFile 压缩的文件
* @param name 压缩的名字
* @param bos 缓存
*/
private static void zip(ZipOutputStream zipOutputStream, File targetFile, String name, BufferedOutputStream bos) throws IOException {
// 如果是文件夹
if (targetFile.isDirectory()) {
File[] files = targetFile.listFiles(); // 获取所有文件
// 如果是空文件夹,也要压缩
if (files.length == 0) {
zipOutputStream.putNextEntry(new ZipEntry(name + "/"));
}
System.out.println(name);
for (File f : files) {
// 递归处理
// name : 文件夹名字+f.separator(分割符号)+文件名称
zip(zipOutputStream, f, name + f.separator + f.getName(), bos);
}
} else {
// 如果是文件 写入zip流
zipOutputStream.putNextEntry(new ZipEntry(name));
InputStream in = new FileInputStream(targetFile);
BufferedInputStream bis = new BufferedInputStream(in);
int len = -1;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
bos.flush(); // 每次写入完成之后都要刷新一下缓存,不然下一次生成文件就会文件错误
}
bis.close();
}
}
// 文件解压
/**
* @param zipFilePath 要压缩文件路径
* @param newPathParent 放在哪个路径
*/
public static void deCompression(String zipFilePath, String newPathParent) {
try {
// 输出流
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFilePath));
File file = null;
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null && !zipEntry.isDirectory()) {
// 这里包括文件文件夹的创建
file = new File(newPathParent, zipEntry.getName());
// 如果这个不是文件,就创建上级文件夹
if (!file.exists()) {
new File(file.getParent()).mkdir();
}
// 写入文件
OutputStream out = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);
int len = -1;
byte[] bytes = new byte[1024];
while ((len = zipInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, len);
bufferedOutputStream.flush(); // 刷新缓存
}
bufferedOutputStream.close();
}
System.out.println("解压成功");
zipInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
java二十(文件的压缩和解压)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- zlib的一些函数: zlib.adler32(s [,crc]) 返回字符串的Adler32校验码。参数''c...
- minizip 的使用方法: ziparchive是基于开源代码”MiniZip”的zip压缩与解压的Object...
- Zip文件结构 ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。 ...
- 由于.rar的安装要使用rarlinux,所以首先要下载rarlinux,然后安装它。安装过程如下: 下载rarl...