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