解压缩流/压缩流:
解压缩流:
解压本质:把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
注:Java只认zip格式
在正式写之前,先准备好压缩文件和解压完需要存放文件的文件夹
下面直接给出案例:
package com.zhou.myzipstream;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipStreamDemo1 {
//定义一个方法来解压
public static void unzip(File src,File dest) throws IOException {
//创建一个解压缩流用来读取压缩包中的数据
ZipInputStream zip = new ZipInputStream(new FileInputStream(src));
// 要先获取到压缩包里面的每一个zipentry对象
//表示当前在压缩包中获取的文件或文件夹
ZipEntry entry;
while((entry = zip.getNextEntry())!=null){
System.out.println(entry);
//文件夹:需要在目的地dest出创建一个同样的文件夹
//文件:需要读取到压缩包中的文件,并把他存放到目的地dest文件夹中(按照层级目录进行存放)
if(entry.isDirectory()){
//文件夹:需要在目的地dest处创建一个同样的文件夹
File file = new File(dest,entry.toString());
file.mkdirs();
}else{
//文件:需要读取到压缩包中的文件,并把它存放到目的地dest文件夹中
FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));
int b;
while((b = zip.read())!=-1){
//写到目的地
fos.write(b);
}
fos.close();
//表示在压缩包中的一个文件处理结束了
zip.closeEntry();
}
}
zip.close();
}
public static void main(String[] args) throws IOException {
//1.创建一个File表示要解压的压缩包
File src = new File("D:\\a\\YaSuo.zip");
//2.创建一个File表示解压的目的地
File dest = new File("D:\\b");
//调用方法
unzip(src,dest);
}
}
核心就是操作ZipEntry对象,也就是压缩文件中的每一个文件夹或者文件。
ZipInputStream表示解压缩输入流
mkdir()方法用于创建单级目录,如果父级目录不存在则创建失败。
mkdirs()方法用于创建多级目录,如果父级目录不存在则会一并创建。
例如,如果要创建目录“/a/b/c”,使用mkdir()方法需要先创建“/a”和“/a/b”两个目录,而使用mkdirs()方法则可以直接创建“/a/b/c”目录。
总之,mkdir()方法适用于创建单级目录,mkdirs()方法适用于创建多级目录。
运行结果:
压缩流:
压缩单个文件案例:
package com.zhou.myzipstream;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipStreamDemo2 {
//压缩方法
public static void toZip(File src,File dest) throws IOException {
//1.创建压缩流关联压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"js.zip")));
//2.创建ZipEntry对象,表示压缩包里面的每一个文件夹和文件
ZipEntry entry = new ZipEntry("js.txt");
//3.把ZipEntry对象放到压缩包当中
zos.putNextEntry(entry);
//4.把src文件中的数据写到压缩包中
FileInputStream fis = new FileInputStream(src);
int b;
while ((b = fis.read())!=-1){
zos.write(b);
}
//5.释放资源
zos.closeEntry();
zos.close();
}
public static void main(String[] args) throws IOException {
//1.创建File对象表示要压缩的文件
File src = new File("D:\\b\\js.txt");
//2.创建File对象表示压缩包的位置
File dest = new File("D:\\a");
//3.调用方法用于压缩
toZip(src,dest);
}
}
ZipOutputStream为压缩输出流,关联好压缩包后,因为压缩文件是返回在压缩包里面的,所以光写一个父级路径是不够的,需要在后面加上子路径。
压缩文件夹:
package com.zhou.myzipstream;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipStreamDemo3 {
public static void main(String[] args) throws IOException {
//压缩文件夹
//1.创建File对象表示要压缩的文件夹
File src = new File("D:\\b\\new");
//2.创建File对象表示压缩包放在哪里(压缩包的父级路径)
File destParent = src.getParentFile();//D:\\b
//3.创建File对象表示压缩包路径
File dest = new File(destParent,src.getName() + ".zip");
//4.创建压缩流关联压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
//5.获取src里面的每一个文件,变成ZipEntry对象,放入压缩包当中
toZip(src,zos,src.getName());
//6.释放资源
zos.close();
}
/*获取到src里面的每一个文件,变成ZipEntry对象,放入压缩包当中
* 三个参数分别是:数据源、压缩流、压缩包内部的路径*/
public static void toZip(File src,ZipOutputStream zos,String name) throws IOException {
//进入src文件夹
File[] files = src.listFiles();
//遍历数组
for(File file : files) {
if(file.isFile()){
//判断-文件,变成ZipEntry对象,放入到压缩包中
ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
zos.putNextEntry(entry);
//读取文件中的数据,写到压缩包
FileInputStream fis = new FileInputStream(file);
int b;
while ((b = fis.read()) != -1){
zos.write(b);
}
fis.close();
zos.closeEntry();
}else{
//判断-文件夹,递归
toZip(file,zos,name + "\\" + file.getName());
}
}
}
}
listFiles()方法是Java中File类的一个方法,用于返回一个文件夹中所有文件和子文件夹的File对象数组。该方法返回的数组包含指定文件夹中所有文件和子文件夹的File对象,但不包括文件夹本身。如果文件夹不存在或者不是一个文件夹,则返回null。
核心代码是:
ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
如果不这么写,会把D盘放进压缩文件里面。
运行结果: