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();
}
}
}
网友评论