项目中经常遇到需要写文件的需求,常规思路是先写非压缩文件,然后把文件在压缩。
但是项目中遇到一种情况,非压缩文件要超过30G,如果先生成非压缩文件,在压缩系统空间不够,
因此尝试编写一个直接生成压缩文件
代码如下:
package com.wuss.utils;
import lombok.SneakyThrows;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileUtils {
// Zip文件的路径
private String zipPath;
//解压后的文件名
private String innerFileName;
//换行字符串
private String nextLineStr = System.getProperty("line.separator", "\n");;
//编码
Charset charset = Charset.forName("UTF-8");
ZipOutputStream out = null;
boolean appendNextLine = false;
@SneakyThrows
public ZipFileUtils(String zipPath, String innerFileName) {
this(zipPath,innerFileName,Charset.forName("UTF-8"));
}
@SneakyThrows
public ZipFileUtils(String zipPath, String innerFileName, Charset charset) {
this.zipPath = zipPath;
this.innerFileName = innerFileName;
this.charset = charset;
out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipPath)));
out.putNextEntry(new ZipEntry(innerFileName));
}
@SneakyThrows
public void writeFile(Collection<String> data){
for (String line : data) {
nextLine();
out.write((line).getBytes(charset));
}
out.flush();
}
@SneakyThrows
public void nextLine(){
if (appendNextLine){
out.write(nextLineStr.getBytes(charset));
return;
}
appendNextLine = true;
}
/**
* 关闭的时候使用该方法
*/
@SneakyThrows
public void finish(){
out.flush();
out.finish();
out.close();
}
public static void main(String[] args) {
List<String> collect = IntStream.range(1, 10).boxed().map(e -> e + "").collect(Collectors.toList());
ZipFileUtils zipFileUtils = new ZipFileUtils("/Users/wuss/Desktop/a.zip","b.txt");
zipFileUtils.writeFile(collect);
collect = IntStream.range(10, 20).boxed().map(e -> e + "").collect(Collectors.toList());
zipFileUtils.writeFile(collect);
collect = IntStream.range(100, 200).boxed().map(e -> e + "").collect(Collectors.toList());
zipFileUtils.writeFile(collect);
zipFileUtils.finish();
}
}