压缩流分类
解压缩流:ZipInputStream
压缩流:ZipOutputStream
解压缩流
把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
案例演示:
package com.liming.myzipstream;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* 解压缩流
*/
public class ZipStreamDemo01 {
public static void main(String[] args) throws IOException {
//1. 创建一个File表示要压缩的压缩包
File src = new File("D:\\aaa.zip");
//2. 创建一个File表示解压的目的地
File dest = new File("D:\\");
//调用方法
unzip(src,dest);
}
/**
* 定义解压方法
* @param src
* @param dest
*/
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){
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();
}
}
压缩流
把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中
案例一:
压缩单个文件
package com.liming.myzipstream;
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.ZipOutputStream;
/**
* 压缩单个文件
*/
public class ZipStreamDemo02 {
public static void main(String[] args) throws IOException {
//1.创建File对象表示要压缩的文件
File src = new File("D:\\a.txt");
//2.创建File对象表示压缩包的位置
File dest = new File("D:\\");
//3.调用方法
toZip(src, dest);
}
/**
* 压缩
*
* @param src 要压缩的文件
* @param dest 压缩包的位置
*/
public static void toZip(File src, File dest) throws IOException {
//1.创建压缩流关联压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.txt")));
//2.创建ZipEntry对象,表示压缩包里面的每一个文件和文件夹
ZipEntry entry = new ZipEntry("a.txt");
//3.把ZipEntry对象放到压缩包中
zos.putNextEntry(entry);
//4.把src文件中的数据写到压缩包中
FileInputStream fis = new FileInputStream(src);
int b;
while ((b = fis.read()) != -1){
zos.write(b);
}
zos.closeEntry();
zos.close();
}
}
案列二:
压缩文件夹
package com.liming.myzipstream;
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.ZipOutputStream;
/**
* 压缩文件夹
*/
public class ZipStreamDemo03 {
public static void main(String[] args) throws IOException {
//1.创建对象表示要压缩的文件
File src = new File("D:\\aaa");
//2.创建对象表示压缩包放在哪
File destParent = src.getParentFile();//D:\\
File dest = new File(destParent, src.getName() + ".zip");
//3.创建压缩流关联压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
//5.获取src里面每一个文件变成ZipEntry对象,放入到压缩包中
toZip(src, zos, src.getName());
//6.释放资源
zos.close();
}
/**
* 压缩文件夹
*
* @param src 数据源
* @param zos 压缩流
* @param name 压缩包内部的路径
*/
public static void toZip(File src, ZipOutputStream zos, String name) throws IOException {
//1.进入src文件夹
File[] files = src.listFiles();
//2.遍历数组
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());
}
}
}
}