zip压缩

package io;

import static org.apache.commons.compress.archivers.zip.ZipArchiveEntry.PLATFORM_UNIX;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils;

public class CpmpressTest {

    public static void main(String[] args) {
        File zipFile = new File("I://中国.zip");
        File dir = new File("I:\aaa\event_20201104");
        apacheCompress(zipFile, dir.listFiles());
    }

    /**
     *  jdk   util.zip 实现
     * @param zipFile
     * @param files
     * @return
     */
    public static File jdkCompress(File zipFile, File[] fs) {
        long begin = System.currentTimeMillis();
        File rsFile = null;
        try (FileOutputStream fos = new FileOutputStream(zipFile);
                ZipOutputStream zos = new ZipOutputStream(fos, StandardCharsets.UTF_8);) {
            rsFile = zipFile;
            int index =1;
            for (File file : fs) {
                byte[] buf = new byte[4 * 1024];
                String name = "中国/" + file.getName();
                ZipEntry ze = new ZipEntry(name);
                zos.putNextEntry(ze);
                int len;
                try (FileInputStream in = new FileInputStream(file)) {
                    while ((len = in.read(buf)) != -1) {
                        zos.write(buf, 0, len);
                    }
                    zos.closeEntry();
                }
                System.out.println("第"+index+"个完成,耗时(ms):"+(System.currentTimeMillis() - begin));
                index++;
            }
        } catch (Exception e) {
        }
        System.out.println(System.currentTimeMillis() - begin);
        return rsFile;
    }

    /**
     *  解决linux中文文件名乱码(common-Compress实现) 
     * @param zipFile
     * @param files
     * @return
     */
    public static File apacheCompress(File zipFile, File[] files)  {
        long begin = System.currentTimeMillis();
        File rsFile = null;
        try (
                ZipArchiveOutputStream zipOutput =  new ZipArchiveOutputStream(zipFile);
        ){
                rsFile = zipFile;
                int index =1;
                for (File f : files) {
                    //测试中文:添加了中国的包前缀
                    String name =  "中国/"+ f.getName();
                    // 获取每个文件相对路径,作为在ZIP中路径,读取文件大小 及修改时间
                    ZipArchiveEntry entry = (ZipArchiveEntry)(zipOutput.createArchiveEntry(f, name));
                    entry.setUnixMode(PLATFORM_UNIX);
                    zipOutput.putArchiveEntry(entry);
                    if (f.isFile()) {
                        try (InputStream i = Files.newInputStream(f.toPath())) {
                            IOUtils.copy(i, zipOutput);
                        }
                    }
                    zipOutput.closeArchiveEntry();
                    System.out.println("第"+index+"个完成,耗时(ms):"+(System.currentTimeMillis() - begin));
                    index++;
                }
            zipOutput.finish();
            System.out.println(System.currentTimeMillis() - begin);
        }catch (Exception e) {
            // TODO: handle exception
        }
        return rsFile;
    }
}
原文地址:https://www.cnblogs.com/luyang08/p/13925779.html