解压的本质:
压缩:把每一个文件变成ZipEntry对象存储到本地
解压:把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
解压流:
ZipInputStream()
获取到zip压缩包内的每一个ZipEntry对象,遍历所有entry对象。
如果是文件夹,创建同名文件夹。
如果是文件,通过解压缩流读取每个entry对象,同时使用字节流将数据写出,字节流会自动创建文件对象。
public class 解压缩流 {
public static void main(String[] args) {
//创建一个File表示要解压的压缩包
File src=new File("/Users/XXX/IdeaProjects/basecode/day02/aaaa/a.txt");
//创建一个File对象表示解压到目的地
File dest=new File("/Users/XXX/IdeaProjects/basecode/day02/aaaa/");
}
//定义一个方法解压
public static void unzip(File src,File dest) throws IOException {
//解压的本质:把压缩包里的每一个文件或者文件夹读取出来,按照层级拷贝到目的地中
//创建一个解压缩流来读取压缩包中的数据
ZipInputStream zis=new ZipInputStream(new FileInputStream(src));
//获取到压缩包里的每一个entry对象
ZipEntry zipEntry;
//getNextEntry方法可以获取到entry对象
while ((zipEntry=zis.getNextEntry())!=null){
if (zipEntry.isDirectory()){
//如果是文件夹
File file=new File(dest,zipEntry.getName());//父级路径+子路径
file.mkdirs();
}else {
//如果是文件,需要将文件读取到对应层级的文件夹中
FileOutputStream fos=new FileOutputStream(new File(dest+zipEntry.getName()));
int b;
while ((b=zis.read())!=-1){
fos.write(b);
}
fos.close();
zis.closeEntry();
}
zis.close();
}
}
}