压缩流-ZipOutputStream的用法详解
ZipOutputStream类属于OutputStream间接类,它是一个用于输出流,可以将文件和目录压缩成ZIP格式的存档文件(将文件或目录写入ZIP文件)。
构造方法
该类提供两个构造方法区别在于是否允许用户自定义字符集(Charset)
,第一个构造方法默认将字符集固定为 StandardCharsets.UTF_8。
常用方法
1. public void putNextEntry(ZipEntry e);
开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。ZipEntry就是一个条目(条目就是ZIP文件中的文件见下图案例)
2.public void closeEntry();
关闭当前 ZIP 条目并定位流以写入下一个条目
3.public void setLevel(int level)
设置条目压缩级别
4.ZipOutputStream 间接继承了 OutputStream 所以实现了 OutputStream 的方法,write,finish等
简单使用
package com.zcf;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description: StudentEntity
* @Author: 风清
* @CreateTime: 2025-03-16 14:35
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity {
@JSONField(name = "student_name",ordinal = 1)
private String name;
@JSONField(name = "student_age",ordinal = 2)
private Integer age;
}
/**
* @Description: FileTest 测试类
* @Author: 风清
* @CreateTime: 2025-03-13 19:53
*/
public class JsonFileTest {
@Test
public void test() {
//指定ZIP文件位置
File file = new File("E:\\javatest\\StudentTest.zip");
//构建压缩数据
StudentEntity student1 = StudentEntity.builder().name("王二").age(18).build();
StudentEntity student2 = StudentEntity.builder().name("张三").age(18).build();
StudentEntity student3 = StudentEntity.builder().name("李四").age(18).build();
ArrayList<StudentEntity> students = Lists.newArrayList(student1, student2, student3);
/**创建ZIP压缩文件对象
在for循环外创建:这里解释一下为什么不在循环内创建
1.FileOutputStream 默认构造方法会导致每次创建FileOutputStream 对象时,覆盖掉原来内容
2.FileOutputStream(File,true)---zip文件是一种特定格式的文件,追加模式会导致zip格式损坏
**/
try (FileOutputStream fos = new FileOutputStream(file); ZipOutputStream zos = new ZipOutputStream(fos)) {
for (StudentEntity student : students) {
String zip = student.getName() + student.getAge() + ".json";
zos.setLevel(1); //设置压缩等级
zos.putNextEntry(new ZipEntry(zip)); //设置文件条目
zos.write(JSON.toJSONString(student).getBytes()); //写入数据
zos.closeEntry();//关闭条目,以写入下一条
//注意这里不要习惯性finish,可以理解为zip包是一个文件,finish会导致zip写入结束
//zos.finish();//习惯性刷
}
}catch (IOException e) {
throw new RuntimeException(e);
}
}
}
结果