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; } }