Zip写文件工具类

项目中经常遇到需要写文件的需求,常规思路是先写非压缩文件,然后把文件在压缩。
但是项目中遇到一种情况,非压缩文件要超过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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值