package com.imyeyu.compress; import com.imyeyu.io.IO; import java.io.BufferedOutputStream; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * Zip 压缩器 * * @author 夜雨 * @version 2024-06-30 19:46 */ public class ZipCompressor extends Compressor { @Override public void run(String fromPath, OutputStream toStream) throws Exception { File fromFile = new File(fromPath); List files = IO.listFile(fromFile); String basePath = files.getFirst().getParentFile().getAbsolutePath(); initByteProgress(IO.calcSize(fromFile)); try (ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(nonClosing(toStream)))) { for (File sourceFile : files) { String name = sourceFile.getAbsolutePath().substring(basePath.length() + 1); zipOutputStream.putNextEntry(new ZipEntry(normalizeEntryName(name))); try (InputStream inputStream = IO.getInputStream(sourceFile)) { transfer(inputStream, zipOutputStream); } zipOutputStream.closeEntry(); handleFile(sourceFile); } zipOutputStream.finish(); finishProgress(); } finally { resetProgress(); } } }