diff --git a/README.md b/README.md index f2cc625..fe22abd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ # timi-compress -Java 压缩、解压缩工具 \ No newline at end of file +Java 压缩、解压缩工具 + +## 调用方式 + +压缩: + +```java +ZipCompressor.of("testSrc").toFile("testOut/test.zip"); +TarCompressor.of(file).toStream(outputStream); +``` + +解压: + +```java +ZipDecompressor.of("testOut/test.zip").to("testOutDe"); +GZipDecompressor.of(inputStream).to("testOutDe"); +``` diff --git a/pom.xml b/pom.xml index c7134e7..9238949 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.imyeyu.compress timi-compress - 0.0.2 + 0.0.3 true diff --git a/src/main/java/com/imyeyu/compress/AbstractRunner.java b/src/main/java/com/imyeyu/compress/AbstractRunner.java index 100f45f..d689e41 100644 --- a/src/main/java/com/imyeyu/compress/AbstractRunner.java +++ b/src/main/java/com/imyeyu/compress/AbstractRunner.java @@ -1,6 +1,7 @@ package com.imyeyu.compress; import com.imyeyu.java.bean.CallbackArg; +import com.imyeyu.java.bean.timi.TimiException; import com.imyeyu.utils.OS; import java.io.File; @@ -11,7 +12,7 @@ import java.io.InputStream; import java.io.OutputStream; /** - * 抽象压缩执行器 + * 抽象处理器 * * @param 处理器类型 * @author 夜雨 @@ -273,16 +274,12 @@ public abstract class AbstractRunner> implements OS. * @return 规范化后的名称 */ protected String normalizeEntryName(String entryName) { - if (entryName == null || entryName.isBlank()) { - throw new IllegalArgumentException("条目名称不能为空"); - } + TimiException.required(entryName, "not found entryName"); String normalized = entryName.replace('\\', '/'); while (normalized.startsWith("/")) { normalized = normalized.substring(1); } - if (normalized.isBlank()) { - throw new IllegalArgumentException("条目名称不能为空"); - } + TimiException.required(normalized, "not found normalized entryName"); return normalized; } } diff --git a/src/main/java/com/imyeyu/compress/CompressType.java b/src/main/java/com/imyeyu/compress/CompressType.java index 92a3952..fdad8d3 100644 --- a/src/main/java/com/imyeyu/compress/CompressType.java +++ b/src/main/java/com/imyeyu/compress/CompressType.java @@ -30,10 +30,10 @@ public enum CompressType { /** Tar */ TAR(TarCompressor.class, TarDecompressor.class); - /** 压缩类 */ + /** 压缩器类型 */ final Class> compressorType; - /** 解压类 */ + /** 解压器类型 */ final Class> decompressorType; CompressType(Class> compressorType, Class> decompressorType) { @@ -51,6 +51,28 @@ public enum CompressType { return Ref.newInstance(compressorType); } + /** + * 获取带源路径的压缩操作对象 + * + * @param fromPath 源路径 + * @return 压缩操作对象 + * @throws Exception 实例化失败 + */ + public Compressor ofCompress(String fromPath) throws Exception { + return getCompressor().from(fromPath); + } + + /** + * 获取带源文件的压缩操作对象 + * + * @param fromFile 源文件 + * @return 压缩操作对象 + * @throws Exception 实例化失败 + */ + public Compressor ofCompress(File fromFile) throws Exception { + return getCompressor().from(fromFile); + } + /** * 获取解压操作对象 * @@ -61,6 +83,28 @@ public enum CompressType { return Ref.newInstance(decompressorType); } + /** + * 获取带源文件的解压操作对象 + * + * @param fromFile 源压缩文件 + * @return 解压操作对象 + * @throws Exception 实例化失败 + */ + public Decompressor ofCompressed(File fromFile) throws Exception { + return getDecompressor().from(fromFile); + } + + /** + * 获取带源输入流的解压操作对象 + * + * @param fromStream 源压缩输入流 + * @return 解压操作对象 + * @throws Exception 实例化失败 + */ + public Decompressor ofCompressed(InputStream fromStream) throws Exception { + return getDecompressor().from(fromStream); + } + /** * 根据文件获取解压操作对象 * 会读取文件头识别压缩格式 @@ -75,21 +119,21 @@ public enum CompressType { byte[] head = new byte[512]; int length = inputStream.read(head); if (length == -1) { - throw new UnsupportedOperationException("not support file"); + throw new UnsupportedOperationException("empty file"); } if (SevenZFile.matches(head, length)) { - return Z7.getDecompressor(); + return Z7.ofCompressed(file); } if (ZipArchiveInputStream.matches(head, length)) { - return ZIP.getDecompressor(); + return ZIP.ofCompressed(file); } if (GzipCompressorInputStream.matches(head, length)) { - return GZIP.getDecompressor(); + return GZIP.ofCompressed(file); } if (TarArchiveInputStream.matches(head, length)) { - return TAR.getDecompressor(); + return TAR.ofCompressed(file); } } - throw new UnsupportedOperationException("not support headHex"); + throw new UnsupportedOperationException("not support file"); } } diff --git a/src/main/java/com/imyeyu/compress/Compressor.java b/src/main/java/com/imyeyu/compress/Compressor.java index 0bcffba..ba165e1 100644 --- a/src/main/java/com/imyeyu/compress/Compressor.java +++ b/src/main/java/com/imyeyu/compress/Compressor.java @@ -1,6 +1,7 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; +import com.imyeyu.java.bean.timi.TimiException; import java.io.File; import java.io.OutputStream; @@ -14,33 +15,78 @@ import java.io.OutputStream; */ public abstract class Compressor> extends AbstractRunner { + /** 源路径 */ + private String fromPath; + /** - * 将指定路径下的文件压缩到目标文件 + * 绑定源路径 * * @param fromPath 源路径 - * @param toFile 目标压缩文件 * @return 当前压缩器 - * @throws Exception 压缩失败 */ - public T run(String fromPath, File toFile) throws Exception { - doRunToFile(fromPath, toFile); + public T from(String fromPath) { + TimiException.required(fromPath, "not found fromPath"); + this.fromPath = fromPath; return self(); } /** - * 将指定路径下的文件压缩到输出流 + * 绑定源文件 + * + * @param fromFile 源文件 + * @return 当前压缩器 + */ + public T from(File fromFile) { + TimiException.required(fromFile, "not found fromFile"); + return from(fromFile.getAbsolutePath()); + } + + /** + * 压缩到目标文件 + * + * @param toFile 目标压缩文件 + * @return 当前压缩器 + * @throws Exception 压缩失败 + */ + public T toFile(File toFile) throws Exception { + toFile(requireFromPath(), toFile); + return self(); + } + + /** + * 压缩到目标文件路径 + * + * @param toPath 目标压缩文件路径 + * @return 当前压缩器 + * @throws Exception 压缩失败 + */ + public T toFile(String toPath) throws Exception { + return toFile(IO.file(toPath)); + } + + /** + * 压缩到输出流 * 输出流由调用方管理 * - * @param fromPath 源路径 * @param toStream 目标输出流 * @return 当前压缩器 * @throws Exception 压缩失败 */ - public T run(String fromPath, OutputStream toStream) throws Exception { - doRun(fromPath, toStream); + public T toStream(OutputStream toStream) throws Exception { + toStream(requireFromPath(), toStream); return self(); } + /** + * 获取已绑定的源路径 + * + * @return 源路径 + */ + protected String requireFromPath() { + TimiException.required(fromPath, "not found source"); + return fromPath; + } + /** * 执行压缩到目标文件 * @@ -48,9 +94,9 @@ public abstract class Compressor> extends AbstractRunner * @param toFile 目标压缩文件 * @throws Exception 压缩失败 */ - protected void doRunToFile(String fromPath, File toFile) throws Exception { + protected void toFile(String fromPath, File toFile) throws Exception { try (OutputStream outputStream = IO.getOutputStream(toFile)) { - doRun(fromPath, outputStream); + toStream(fromPath, outputStream); outputStream.flush(); } catch (Exception exception) { if (isInterrupt) { @@ -70,5 +116,5 @@ public abstract class Compressor> extends AbstractRunner * @param toStream 目标输出流 * @throws Exception 压缩失败 */ - protected abstract void doRun(String fromPath, OutputStream toStream) throws Exception; + protected abstract void toStream(String fromPath, OutputStream toStream) throws Exception; } diff --git a/src/main/java/com/imyeyu/compress/Decompressor.java b/src/main/java/com/imyeyu/compress/Decompressor.java index c724803..0b7b9d7 100644 --- a/src/main/java/com/imyeyu/compress/Decompressor.java +++ b/src/main/java/com/imyeyu/compress/Decompressor.java @@ -1,6 +1,7 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; +import com.imyeyu.java.bean.timi.TimiException; import java.io.File; import java.io.InputStream; @@ -14,31 +15,66 @@ import java.io.InputStream; */ public abstract class Decompressor> extends AbstractRunner { + /** 源压缩文件 */ + private File fromFile; + + /** 源压缩输入流 */ + private InputStream fromStream; + /** - * 将压缩文件解压到目标目录 + * 绑定源压缩文件 * * @param fromFile 源压缩文件 - * @param toPath 目标目录 * @return 当前解压器 - * @throws Exception 解压失败 */ - public T run(File fromFile, String toPath) throws Exception { - doRunFromFile(fromFile, toPath); + public T from(File fromFile) { + TimiException.required(fromFile, "not found fromFile"); + this.fromFile = fromFile; + this.fromStream = null; return self(); } /** - * 将压缩输入流解压到目标目录 - * 输入流由调用方管理 + * 绑定源压缩文件路径 + * + * @param fromPath 源压缩文件路径 + * @return 当前解压器 + */ + public T from(String fromPath) { + TimiException.required(fromPath, "not found fromPath"); + return from(new File(fromPath)); + } + + /** + * 绑定源压缩输入流 * * @param fromStream 源压缩输入流 + * @return 当前解压器 + */ + public T from(InputStream fromStream) { + TimiException.required(fromStream, "not found fromStream"); + this.fromStream = fromStream; + this.fromFile = null; + return self(); + } + + /** + * 解压到目标目录 + * * @param toPath 目标目录 * @return 当前解压器 * @throws Exception 解压失败 */ - public T run(InputStream fromStream, String toPath) throws Exception { - doRun(fromStream, toPath); - return self(); + public T toPath(String toPath) throws Exception { + if (fromFile != null) { + toPath(fromFile, toPath); + return self(); + } + if (fromStream != null) { + toPath(fromStream, toPath); + return self(); + } + throw new IllegalStateException("not found source"); } /** @@ -48,9 +84,9 @@ public abstract class Decompressor> extends AbstractRu * @param toPath 目标目录 * @throws Exception 解压失败 */ - protected void doRunFromFile(File fromFile, String toPath) throws Exception { + protected void toPath(File fromFile, String toPath) throws Exception { try (InputStream inputStream = IO.getInputStream(fromFile)) { - doRun(inputStream, toPath); + toPath(inputStream, toPath); } } @@ -61,5 +97,5 @@ public abstract class Decompressor> extends AbstractRu * @param toPath 目标目录 * @throws Exception 解压失败 */ - protected abstract void doRun(InputStream fromStream, String toPath) throws Exception; + protected abstract void toPath(InputStream fromStream, String toPath) throws Exception; } diff --git a/src/main/java/com/imyeyu/compress/GZipCompressor.java b/src/main/java/com/imyeyu/compress/GZipCompressor.java index 0e27f4d..50d6e77 100644 --- a/src/main/java/com/imyeyu/compress/GZipCompressor.java +++ b/src/main/java/com/imyeyu/compress/GZipCompressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; @@ -22,36 +21,27 @@ import java.util.List; public class GZipCompressor extends Compressor { /** - * 静态执行压缩 + * 创建压缩器 * * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @return 压缩器 */ - public static GZipCompressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static GZipCompressor of(String fromPath) { + return new GZipCompressor().from(fromPath); } /** - * 静态执行压缩 + * 创建压缩器 * - * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @param fromFile 源文件 + * @return 压缩器 */ - public static GZipCompressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new GZipCompressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(fromPath, IO.file(toPath)); + public static GZipCompressor of(File fromFile) { + return new GZipCompressor().from(fromFile); } @Override - protected void doRun(String fromPath, OutputStream toStream) throws Exception { + protected void toStream(String fromPath, OutputStream toStream) throws Exception { File fromFile = new File(fromPath); List files = IO.listFile(fromFile); String basePath = files.getFirst().getParentFile().getAbsolutePath(); diff --git a/src/main/java/com/imyeyu/compress/GZipDecompressor.java b/src/main/java/com/imyeyu/compress/GZipDecompressor.java index c050424..1a6e6d3 100644 --- a/src/main/java/com/imyeyu/compress/GZipDecompressor.java +++ b/src/main/java/com/imyeyu/compress/GZipDecompressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; @@ -12,7 +11,6 @@ import java.io.OutputStream; /** * Gzip 解压器 - * 当前实现保持与原行为一致,实际按 tar.gz 解压 * * @author 夜雨 * @version 2024-06-30 19:47 @@ -20,46 +18,47 @@ import java.io.OutputStream; public class GZipDecompressor extends Decompressor { /** - * 静态执行解压 + * 创建解压器 * - * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @return 当前解压器 - * @throws Exception 解压失败 + * @param fromFile 源压缩文件 + * @return 解压器 */ - public static GZipDecompressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static GZipDecompressor of(File fromFile) { + return new GZipDecompressor().from(fromFile); } /** - * 静态执行解压 + * 创建解压器 * * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前解压器 - * @throws Exception 解压失败 + * @return 解压器 */ - public static GZipDecompressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new GZipDecompressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(IO.file(fromPath), toPath); + public static GZipDecompressor of(String fromPath) { + return new GZipDecompressor().from(fromPath); + } + + /** + * 创建解压器 + * + * @param fromStream 源压缩输入流 + * @return 解压器 + */ + public static GZipDecompressor of(InputStream fromStream) { + return new GZipDecompressor().from(fromStream); } @Override - protected void doRunFromFile(File fromFile, String toPath) throws Exception { + protected void toPath(File fromFile, String toPath) throws Exception { initByteProgress(readTotalSize(fromFile)); try { - super.doRunFromFile(fromFile, toPath); + super.toPath(fromFile, toPath); } finally { resetProgress(); } } @Override - protected void doRun(InputStream fromStream, String toPath) throws Exception { + protected void toPath(InputStream fromStream, String toPath) throws Exception { try ( GzipCompressorInputStream gzipInputStream = new GzipCompressorInputStream(nonClosing(fromStream)); TarArchiveInputStream tarInputStream = new TarArchiveInputStream(gzipInputStream) diff --git a/src/main/java/com/imyeyu/compress/TarCompressor.java b/src/main/java/com/imyeyu/compress/TarCompressor.java index 90d5426..645ccdc 100644 --- a/src/main/java/com/imyeyu/compress/TarCompressor.java +++ b/src/main/java/com/imyeyu/compress/TarCompressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; @@ -20,36 +19,27 @@ import java.util.List; public class TarCompressor extends Compressor { /** - * 静态执行压缩 + * 创建压缩器 * * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @return 压缩器 */ - public static TarCompressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static TarCompressor of(String fromPath) { + return new TarCompressor().from(fromPath); } /** - * 静态执行压缩 + * 创建压缩器 * - * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @param fromFile 源文件 + * @return 压缩器 */ - public static TarCompressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new TarCompressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(fromPath, IO.file(toPath)); + public static TarCompressor of(File fromFile) { + return new TarCompressor().from(fromFile); } @Override - protected void doRun(String fromPath, OutputStream toStream) throws Exception { + protected void toStream(String fromPath, OutputStream toStream) throws Exception { File fromFile = new File(fromPath); List files = IO.listFile(fromFile); String basePath = files.getFirst().getParentFile().getAbsolutePath(); diff --git a/src/main/java/com/imyeyu/compress/TarDecompressor.java b/src/main/java/com/imyeyu/compress/TarDecompressor.java index 5f500a2..2ac8541 100644 --- a/src/main/java/com/imyeyu/compress/TarDecompressor.java +++ b/src/main/java/com/imyeyu/compress/TarDecompressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; @@ -18,46 +17,47 @@ import java.io.OutputStream; public class TarDecompressor extends Decompressor { /** - * 静态执行解压 + * 创建解压器 * - * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @return 当前解压器 - * @throws Exception 解压失败 + * @param fromFile 源压缩文件 + * @return 解压器 */ - public static TarDecompressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static TarDecompressor of(File fromFile) { + return new TarDecompressor().from(fromFile); } /** - * 静态执行解压 + * 创建解压器 * * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前解压器 - * @throws Exception 解压失败 + * @return 解压器 */ - public static TarDecompressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new TarDecompressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(IO.file(fromPath), toPath); + public static TarDecompressor of(String fromPath) { + return new TarDecompressor().from(fromPath); + } + + /** + * 创建解压器 + * + * @param fromStream 源压缩输入流 + * @return 解压器 + */ + public static TarDecompressor of(InputStream fromStream) { + return new TarDecompressor().from(fromStream); } @Override - protected void doRunFromFile(File fromFile, String toPath) throws Exception { + protected void toPath(File fromFile, String toPath) throws Exception { initByteProgress(readTotalSize(fromFile)); try { - super.doRunFromFile(fromFile, toPath); + super.toPath(fromFile, toPath); } finally { resetProgress(); } } @Override - protected void doRun(InputStream fromStream, String toPath) throws Exception { + protected void toPath(InputStream fromStream, String toPath) throws Exception { try (TarArchiveInputStream tarInputStream = new TarArchiveInputStream(nonClosing(fromStream))) { TarArchiveEntry entry; boolean processed = false; diff --git a/src/main/java/com/imyeyu/compress/Z7Compressor.java b/src/main/java/com/imyeyu/compress/Z7Compressor.java index e8468da..795d530 100644 --- a/src/main/java/com/imyeyu/compress/Z7Compressor.java +++ b/src/main/java/com/imyeyu/compress/Z7Compressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry; import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile; @@ -21,39 +20,30 @@ import java.util.List; public class Z7Compressor extends Compressor { /** - * 静态执行压缩 + * 创建压缩器 * * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @return 压缩器 */ - public static Z7Compressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static Z7Compressor of(String fromPath) { + return new Z7Compressor().from(fromPath); } /** - * 静态执行压缩 + * 创建压缩器 * - * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @param fromFile 源文件 + * @return 压缩器 */ - public static Z7Compressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new Z7Compressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(fromPath, IO.file(toPath)); + public static Z7Compressor of(File fromFile) { + return new Z7Compressor().from(fromFile); } @Override - protected void doRun(String fromPath, OutputStream toStream) throws Exception { + protected void toStream(String fromPath, OutputStream toStream) throws Exception { Path tempFile = Files.createTempFile("timi-compress-", ".7z"); try { - run(fromPath, tempFile.toFile()); + from(fromPath).toFile(tempFile.toFile()); try (InputStream inputStream = Files.newInputStream(tempFile)) { transfer(inputStream, toStream, false); toStream.flush(); @@ -64,7 +54,7 @@ public class Z7Compressor extends Compressor { } @Override - protected void doRunToFile(String fromPath, File toFile) throws Exception { + protected void toFile(String fromPath, File toFile) throws Exception { File fromFile = new File(fromPath); List files = IO.listFile(fromFile); String basePath = files.getFirst().getParentFile().getAbsolutePath(); diff --git a/src/main/java/com/imyeyu/compress/Z7Decompressor.java b/src/main/java/com/imyeyu/compress/Z7Decompressor.java index 4996d41..95c0a8a 100644 --- a/src/main/java/com/imyeyu/compress/Z7Decompressor.java +++ b/src/main/java/com/imyeyu/compress/Z7Decompressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry; import org.apache.commons.compress.archivers.sevenz.SevenZFile; @@ -20,46 +19,47 @@ import java.nio.file.Path; public class Z7Decompressor extends Decompressor { /** - * 静态执行解压 + * 创建解压器 * - * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @return 当前解压器 - * @throws Exception 解压失败 + * @param fromFile 源压缩文件 + * @return 解压器 */ - public static Z7Decompressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static Z7Decompressor of(File fromFile) { + return new Z7Decompressor().from(fromFile); } /** - * 静态执行解压 + * 创建解压器 * * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前解压器 - * @throws Exception 解压失败 + * @return 解压器 */ - public static Z7Decompressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new Z7Decompressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(IO.file(fromPath), toPath); + public static Z7Decompressor of(String fromPath) { + return new Z7Decompressor().from(fromPath); + } + + /** + * 创建解压器 + * + * @param fromStream 源压缩输入流 + * @return 解压器 + */ + public static Z7Decompressor of(InputStream fromStream) { + return new Z7Decompressor().from(fromStream); } @Override - protected void doRunFromFile(File fromFile, String toPath) throws Exception { + protected void toPath(File fromFile, String toPath) throws Exception { initByteProgress(readTotalSize(fromFile)); try { - super.doRunFromFile(fromFile, toPath); + super.toPath(fromFile, toPath); } finally { resetProgress(); } } @Override - protected void doRun(InputStream fromStream, String toPath) throws Exception { + protected void toPath(InputStream fromStream, String toPath) throws Exception { Path tempFile = writeTempFile(fromStream); try (SevenZFile file = SevenZFile.builder().setFile(tempFile.toFile()).get()) { SevenZArchiveEntry entry; diff --git a/src/main/java/com/imyeyu/compress/ZipCompressor.java b/src/main/java/com/imyeyu/compress/ZipCompressor.java index 5e3c962..ecf356a 100644 --- a/src/main/java/com/imyeyu/compress/ZipCompressor.java +++ b/src/main/java/com/imyeyu/compress/ZipCompressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import java.io.BufferedOutputStream; import java.io.File; @@ -20,36 +19,27 @@ import java.util.zip.ZipOutputStream; public class ZipCompressor extends Compressor { /** - * 静态执行压缩 + * 创建压缩器 * * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @return 压缩器 */ - public static ZipCompressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static ZipCompressor of(String fromPath) { + return new ZipCompressor().from(fromPath); } /** - * 静态执行压缩 + * 创建压缩器 * - * @param fromPath 源路径 - * @param toPath 目标文件路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前压缩器 - * @throws Exception 压缩失败 + * @param fromFile 源文件 + * @return 压缩器 */ - public static ZipCompressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new ZipCompressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(fromPath, IO.file(toPath)); + public static ZipCompressor of(File fromFile) { + return new ZipCompressor().from(fromFile); } @Override - protected void doRun(String fromPath, OutputStream toStream) throws Exception { + protected void toStream(String fromPath, OutputStream toStream) throws Exception { File fromFile = new File(fromPath); List files = IO.listFile(fromFile); String basePath = files.getFirst().getParentFile().getAbsolutePath(); diff --git a/src/main/java/com/imyeyu/compress/ZipDecompressor.java b/src/main/java/com/imyeyu/compress/ZipDecompressor.java index e083789..598b7ab 100644 --- a/src/main/java/com/imyeyu/compress/ZipDecompressor.java +++ b/src/main/java/com/imyeyu/compress/ZipDecompressor.java @@ -1,7 +1,6 @@ package com.imyeyu.compress; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.CallbackArg; import java.io.File; import java.io.InputStream; @@ -20,46 +19,47 @@ import java.util.zip.ZipInputStream; public class ZipDecompressor extends Decompressor { /** - * 静态执行解压 + * 创建解压器 * - * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @return 当前解压器 - * @throws Exception 解压失败 + * @param fromFile 源压缩文件 + * @return 解压器 */ - public static ZipDecompressor run(String fromPath, String toPath) throws Exception { - return run(fromPath, toPath, null, null); + public static ZipDecompressor of(File fromFile) { + return new ZipDecompressor().from(fromFile); } /** - * 静态执行解压 + * 创建解压器 * * @param fromPath 源压缩文件路径 - * @param toPath 目标目录路径 - * @param fileCallback 文件处理回调 - * @param progressCallback 进度回调 - * @return 当前解压器 - * @throws Exception 解压失败 + * @return 解压器 */ - public static ZipDecompressor run(String fromPath, String toPath, CallbackArg fileCallback, CallbackArg progressCallback) throws Exception { - return new ZipDecompressor() - .fileCallback(fileCallback) - .progressCallback(progressCallback) - .run(IO.file(fromPath), toPath); + public static ZipDecompressor of(String fromPath) { + return new ZipDecompressor().from(fromPath); + } + + /** + * 创建解压器 + * + * @param fromStream 源压缩输入流 + * @return 解压器 + */ + public static ZipDecompressor of(InputStream fromStream) { + return new ZipDecompressor().from(fromStream); } @Override - protected void doRunFromFile(File fromFile, String toPath) throws Exception { + protected void toPath(File fromFile, String toPath) throws Exception { initByteProgress(readTotalSize(fromFile)); try { - super.doRunFromFile(fromFile, toPath); + super.toPath(fromFile, toPath); } finally { resetProgress(); } } @Override - protected void doRun(InputStream fromStream, String toPath) throws Exception { + protected void toPath(InputStream fromStream, String toPath) throws Exception { try (ZipInputStream zipInputStream = new ZipInputStream(nonClosing(fromStream))) { ZipEntry entry; boolean processed = false; diff --git a/src/test/java/test/ClearTest.java b/src/test/java/test/ClearTest.java index 1e1565b..2201b77 100644 --- a/src/test/java/test/ClearTest.java +++ b/src/test/java/test/ClearTest.java @@ -18,4 +18,4 @@ public class ClearTest { IO.destroy(new File("testOutDe")); IO.dir("testOutDe"); } -} \ No newline at end of file +} diff --git a/src/test/java/test/GzipTest.java b/src/test/java/test/GzipTest.java index ae5b8ec..385ed52 100644 --- a/src/test/java/test/GzipTest.java +++ b/src/test/java/test/GzipTest.java @@ -21,22 +21,22 @@ public class GzipTest { @Test public void testStaticCompress() throws Exception { - GZipCompressor compressor = GZipCompressor.run("testSrc", "testOut/test.gz"); + GZipCompressor compressor = GZipCompressor.of("testSrc").toFile("testOut/test.gz"); Assertions.assertNotNull(compressor); } @Test public void testChainCompress() throws Exception { File out = IO.file("testOut/test-chain.gz"); - GZipCompressor compressor = new GZipCompressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); + GZipCompressor compressor = GZipCompressor.of("testSrc"); Assertions.assertSame( compressor, compressor .fileCallback(file -> fileCount.incrementAndGet()) .progressCallback(progress::set) - .run("testSrc", out) + .toFile(out) ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); @@ -45,15 +45,15 @@ public class GzipTest { @Test public void testDecompress() throws Exception { File in = IO.file("testOut/test.gz"); - GZipCompressor.run("testSrc", in.getAbsolutePath()); + GZipCompressor.of("testSrc").toFile(in); File out = IO.dir("testOutDe"); - CompressType.fromFile(in).run(in, out.getAbsolutePath()); + CompressType.fromFile(in).toPath(out.getAbsolutePath()); } @Test public void testCompressToStream() throws Exception { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.GZIP.getCompressor().run("testSrc", outputStream); + CompressType.GZIP.ofCompress("testSrc").toStream(outputStream); } } @@ -61,22 +61,20 @@ public class GzipTest { public void testChainDecompressFromStream() throws Exception { byte[] bytes; try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.GZIP.getCompressor().run("testSrc", outputStream); + CompressType.GZIP.ofCompress("testSrc").toStream(outputStream); bytes = outputStream.toByteArray(); } File out = IO.dir("testOutDeStream/gzip"); - GZipDecompressor decompressor = new GZipDecompressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); - try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { - Assertions.assertSame( - decompressor, - decompressor - .fileCallback(file -> fileCount.incrementAndGet()) - .progressCallback(progress::set) - .run(inputStream, out.getAbsolutePath()) - ); - } + GZipDecompressor decompressor = GZipDecompressor.of(new ByteArrayInputStream(bytes)); + Assertions.assertSame( + decompressor, + decompressor + .fileCallback(file -> fileCount.incrementAndGet()) + .progressCallback(progress::set) + .toPath(out.getAbsolutePath()) + ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); } diff --git a/src/test/java/test/TarTest.java b/src/test/java/test/TarTest.java index cd040e8..e2136b2 100644 --- a/src/test/java/test/TarTest.java +++ b/src/test/java/test/TarTest.java @@ -21,22 +21,22 @@ public class TarTest { @Test public void testStaticCompress() throws Exception { - TarCompressor compressor = TarCompressor.run("testSrc", "testOut/test.tar"); + TarCompressor compressor = TarCompressor.of("testSrc").toFile("testOut/test.tar"); Assertions.assertNotNull(compressor); } @Test public void testChainCompress() throws Exception { File out = IO.file("testOut/test-chain.tar"); - TarCompressor compressor = new TarCompressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); + TarCompressor compressor = TarCompressor.of("testSrc"); Assertions.assertSame( compressor, compressor .fileCallback(file -> fileCount.incrementAndGet()) .progressCallback(progress::set) - .run("testSrc", out) + .toFile(out) ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); @@ -45,15 +45,15 @@ public class TarTest { @Test public void testDecompress() throws Exception { File in = IO.file("testOut/test.tar"); - TarCompressor.run("testSrc", in.getAbsolutePath()); + TarCompressor.of("testSrc").toFile(in); File out = IO.dir("testOutDe"); - CompressType.fromFile(in).run(in, out.getAbsolutePath()); + CompressType.fromFile(in).toPath(out.getAbsolutePath()); } @Test public void testCompressToStream() throws Exception { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.TAR.getCompressor().run("testSrc", outputStream); + CompressType.TAR.ofCompress("testSrc").toStream(outputStream); } } @@ -61,22 +61,20 @@ public class TarTest { public void testChainDecompressFromStream() throws Exception { byte[] bytes; try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.TAR.getCompressor().run("testSrc", outputStream); + CompressType.TAR.ofCompress("testSrc").toStream(outputStream); bytes = outputStream.toByteArray(); } File out = IO.dir("testOutDeStream/tar"); - TarDecompressor decompressor = new TarDecompressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); - try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { - Assertions.assertSame( - decompressor, - decompressor - .fileCallback(file -> fileCount.incrementAndGet()) - .progressCallback(progress::set) - .run(inputStream, out.getAbsolutePath()) - ); - } + TarDecompressor decompressor = TarDecompressor.of(new ByteArrayInputStream(bytes)); + Assertions.assertSame( + decompressor, + decompressor + .fileCallback(file -> fileCount.incrementAndGet()) + .progressCallback(progress::set) + .toPath(out.getAbsolutePath()) + ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); } diff --git a/src/test/java/test/Z7Test.java b/src/test/java/test/Z7Test.java index 9a8ef46..f54e5e6 100644 --- a/src/test/java/test/Z7Test.java +++ b/src/test/java/test/Z7Test.java @@ -21,22 +21,22 @@ public class Z7Test { @Test public void testStaticCompress() throws Exception { - Z7Compressor compressor = Z7Compressor.run("testSrc", "testOut/test.7z"); + Z7Compressor compressor = Z7Compressor.of("testSrc").toFile("testOut/test.7z"); Assertions.assertNotNull(compressor); } @Test public void testChainCompress() throws Exception { File out = IO.file("testOut/test-chain.7z"); - Z7Compressor compressor = new Z7Compressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); + Z7Compressor compressor = Z7Compressor.of("testSrc"); Assertions.assertSame( compressor, compressor .fileCallback(file -> fileCount.incrementAndGet()) .progressCallback(progress::set) - .run("testSrc", out) + .toFile(out) ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); @@ -45,15 +45,15 @@ public class Z7Test { @Test public void testDecompress() throws Exception { File in = IO.file("testOut/test.7z"); - Z7Compressor.run("testSrc", in.getAbsolutePath()); + Z7Compressor.of("testSrc").toFile(in); File out = IO.dir("testOutDe"); - CompressType.fromFile(in).run(in, out.getAbsolutePath()); + CompressType.fromFile(in).toPath(out.getAbsolutePath()); } @Test public void testCompressToStream() throws Exception { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.Z7.getCompressor().run("testSrc", outputStream); + CompressType.Z7.ofCompress("testSrc").toStream(outputStream); } } @@ -61,22 +61,20 @@ public class Z7Test { public void testChainDecompressFromStream() throws Exception { byte[] bytes; try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.Z7.getCompressor().run("testSrc", outputStream); + CompressType.Z7.ofCompress("testSrc").toStream(outputStream); bytes = outputStream.toByteArray(); } File out = IO.dir("testOutDeStream/z7"); - Z7Decompressor decompressor = new Z7Decompressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); - try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { - Assertions.assertSame( - decompressor, - decompressor - .fileCallback(file -> fileCount.incrementAndGet()) - .progressCallback(progress::set) - .run(inputStream, out.getAbsolutePath()) - ); - } + Z7Decompressor decompressor = Z7Decompressor.of(new ByteArrayInputStream(bytes)); + Assertions.assertSame( + decompressor, + decompressor + .fileCallback(file -> fileCount.incrementAndGet()) + .progressCallback(progress::set) + .toPath(out.getAbsolutePath()) + ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); } diff --git a/src/test/java/test/ZipTest.java b/src/test/java/test/ZipTest.java index 86f31b6..333a435 100644 --- a/src/test/java/test/ZipTest.java +++ b/src/test/java/test/ZipTest.java @@ -21,22 +21,22 @@ public class ZipTest { @Test public void testStaticCompress() throws Exception { - ZipCompressor compressor = ZipCompressor.run("testSrc", "testOut/test.zip"); + ZipCompressor compressor = ZipCompressor.of("testSrc").toFile("testOut/test.zip"); Assertions.assertNotNull(compressor); } @Test public void testChainCompress() throws Exception { File out = IO.file("testOut/test-chain.zip"); - ZipCompressor compressor = new ZipCompressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); + ZipCompressor compressor = ZipCompressor.of("testSrc"); Assertions.assertSame( compressor, compressor .fileCallback(file -> fileCount.incrementAndGet()) .progressCallback(progress::set) - .run("testSrc", out) + .toFile(out) ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); @@ -45,15 +45,15 @@ public class ZipTest { @Test public void testDecompress() throws Exception { File in = IO.file("testOut/test.zip"); - ZipCompressor.run("testSrc", in.getAbsolutePath()); + ZipCompressor.of("testSrc").toFile(in); File out = IO.dir("testOutDe"); - CompressType.fromFile(in).run(in, out.getAbsolutePath()); + CompressType.fromFile(in).toPath(out.getAbsolutePath()); } @Test public void testCompressToStream() throws Exception { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.ZIP.getCompressor().run("testSrc", outputStream); + CompressType.ZIP.ofCompress("testSrc").toStream(outputStream); } } @@ -61,22 +61,20 @@ public class ZipTest { public void testChainDecompressFromStream() throws Exception { byte[] bytes; try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - CompressType.ZIP.getCompressor().run("testSrc", outputStream); + CompressType.ZIP.ofCompress("testSrc").toStream(outputStream); bytes = outputStream.toByteArray(); } File out = IO.dir("testOutDeStream/zip"); - ZipDecompressor decompressor = new ZipDecompressor(); AtomicInteger fileCount = new AtomicInteger(); AtomicReference progress = new AtomicReference<>(0D); - try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { - Assertions.assertSame( - decompressor, - decompressor - .fileCallback(file -> fileCount.incrementAndGet()) - .progressCallback(progress::set) - .run(inputStream, out.getAbsolutePath()) - ); - } + ZipDecompressor decompressor = ZipDecompressor.of(new ByteArrayInputStream(bytes)); + Assertions.assertSame( + decompressor, + decompressor + .fileCallback(file -> fileCount.incrementAndGet()) + .progressCallback(progress::set) + .toPath(out.getAbsolutePath()) + ); Assertions.assertTrue(0 < fileCount.get()); Assertions.assertEquals(1D, progress.get()); }