5 Commits
v0.0.1 ... dev

Author SHA1 Message Date
Timi
494e75a922 v0.0.4
All checks were successful
CI/CD / build-deploy (pull_request) Successful in 15s
2026-04-07 16:54:01 +08:00
Timi
829c7f0184 v0.0.4
Some checks failed
CI/CD / build-deploy (pull_request) Failing after 10s
2026-04-07 16:52:13 +08:00
Timi
01c21c7aa0 v0.0.4
Some checks failed
CI/CD / build-deploy (pull_request) Failing after 12s
2026-04-07 16:44:18 +08:00
Timi
b56f4e8969 v0.0.3
All checks were successful
CI/CD / build-deploy (pull_request) Successful in 13s
2026-04-02 16:23:53 +08:00
Timi
56dec33c94 v0.0.2
All checks were successful
CI/CD / build-deploy (pull_request) Successful in 14s
2026-04-01 22:47:09 +08:00
19 changed files with 694 additions and 117 deletions

View File

@@ -1,3 +1,19 @@
# timi-compress
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");
```

View File

@@ -6,7 +6,7 @@
<groupId>com.imyeyu.compress</groupId>
<artifactId>timi-compress</artifactId>
<version>0.0.1</version>
<version>0.0.4</version>
<properties>
<maven.test.skip>true</maven.test.skip>

View File

@@ -1,8 +1,8 @@
package com.imyeyu.compress;
import com.imyeyu.java.bean.CallbackArg;
import com.imyeyu.java.bean.timi.TimiException;
import com.imyeyu.utils.OS;
import lombok.Setter;
import java.io.File;
import java.io.FilterInputStream;
@@ -12,19 +12,18 @@ import java.io.InputStream;
import java.io.OutputStream;
/**
* 抽象压缩执行
* 抽象处理
*
* @param <T> 处理器类型
* @author 夜雨
* @since 2024-06-30 18:09
*/
public abstract class AbstractRunner implements OS.FileSystem {
public abstract class AbstractRunner<T extends AbstractRunner<T>> implements OS.FileSystem {
/** 文件处理回调 */
@Setter
protected CallbackArg<File> fileCallback;
/** 进度回调 */
@Setter
protected CallbackArg<Double> progressCallback;
/** 中断标记 */
@@ -42,6 +41,48 @@ public abstract class AbstractRunner implements OS.FileSystem {
/** 当前已处理字节数 */
private long progressBytes = 0L;
/**
* 设置文件处理回调
*
* @param fileCallback 文件处理回调
* @return 当前处理器
*/
public T setFileCallback(CallbackArg<File> fileCallback) {
this.fileCallback = fileCallback;
return self();
}
/**
* 设置文件处理回调
*
* @param fileCallback 文件处理回调
* @return 当前处理器
*/
public T fileCallback(CallbackArg<File> fileCallback) {
return setFileCallback(fileCallback);
}
/**
* 设置进度回调
*
* @param progressCallback 进度回调
* @return 当前处理器
*/
public T setProgressCallback(CallbackArg<Double> progressCallback) {
this.progressCallback = progressCallback;
return self();
}
/**
* 设置进度回调
*
* @param progressCallback 进度回调
* @return 当前处理器
*/
public T progressCallback(CallbackArg<Double> progressCallback) {
return setProgressCallback(progressCallback);
}
/** 暂停任务 */
public void pause() {
isPause = true;
@@ -60,6 +101,16 @@ public abstract class AbstractRunner implements OS.FileSystem {
isInterrupt = true;
}
/**
* 返回当前处理器
*
* @return 当前处理器
*/
@SuppressWarnings("unchecked")
protected final T self() {
return (T) this;
}
/**
* 初始化字节进度
*
@@ -223,16 +274,12 @@ public abstract class AbstractRunner implements OS.FileSystem {
* @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;
}
}

View File

@@ -30,13 +30,13 @@ public enum CompressType {
/** Tar */
TAR(TarCompressor.class, TarDecompressor.class);
/** 压缩 */
final Class<? extends Compressor> compressorType;
/** 压缩器类型 */
final Class<? extends Compressor<?>> compressorType;
/** 解压 */
final Class<? extends Decompressor> decompressorType;
/** 解压器类型 */
final Class<? extends Decompressor<?>> decompressorType;
CompressType(Class<? extends Compressor> compressorType, Class<? extends Decompressor> decompressorType) {
CompressType(Class<? extends Compressor<?>> compressorType, Class<? extends Decompressor<?>> decompressorType) {
this.compressorType = compressorType;
this.decompressorType = decompressorType;
}
@@ -47,48 +47,93 @@ public enum CompressType {
* @return 压缩操作对象
* @throws Exception 实例化失败
*/
public Compressor getCompressor() throws Exception {
public Compressor<?> getCompressor() throws Exception {
return Ref.newInstance(compressorType);
}
/**
* 获取带源路径的压缩操作对象
*
* @param fromPath 源路径
* @return 压缩操作对象
* @throws Exception 实例化失败
*/
public Compressor<?> compressFrom(String fromPath) throws Exception {
return getCompressor().of(fromPath);
}
/**
* 获取带源文件的压缩操作对象
*
* @param fromFile 源文件
* @return 压缩操作对象
* @throws Exception 实例化失败
*/
public Compressor<?> compressFrom(File fromFile) throws Exception {
return getCompressor().of(fromFile);
}
/**
* 获取解压操作对象
*
* @return 解压操作对象
* @throws Exception 实例化失败
*/
public Decompressor getDecompressor() throws Exception {
public Decompressor<?> getDecompressor() throws Exception {
return Ref.newInstance(decompressorType);
}
/**
* 根据文件获取解压操作对象。会读取文件头识别压缩格式
* 获取带源文件的解压操作对象
*
* @param fromFile 源压缩文件
* @return 解压操作对象
* @throws Exception 实例化失败
*/
public Decompressor<?> decompressedFrom(File fromFile) throws Exception {
return getDecompressor().of(fromFile);
}
/**
* 获取带源输入流的解压操作对象
*
* @param fromStream 源压缩输入流
* @return 解压操作对象
* @throws Exception 实例化失败
*/
public Decompressor<?> decompressedFrom(InputStream fromStream) throws Exception {
return getDecompressor().of(fromStream);
}
/**
* 根据文件获取解压操作对象
* 会读取文件头识别压缩格式
*
* @param file 文件
* @return 解压操作对象
* @throws UnsupportedOperationException 不支持的文件
* @throws Exception 实例化失败
*/
public static Decompressor fromFile(File file) throws Exception {
public static Decompressor<?> from(File file) throws Exception {
try (InputStream inputStream = IO.getInputStream(file)) {
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.decompressedFrom(file);
}
if (ZipArchiveInputStream.matches(head, length)) {
return ZIP.getDecompressor();
return ZIP.decompressedFrom(file);
}
if (GzipCompressorInputStream.matches(head, length)) {
return GZIP.getDecompressor();
return GZIP.decompressedFrom(file);
}
if (TarArchiveInputStream.matches(head, length)) {
return TAR.getDecompressor();
return TAR.decompressedFrom(file);
}
}
throw new UnsupportedOperationException("not support headHex");
throw new UnsupportedOperationException("not support file");
}
}

View File

@@ -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;
@@ -8,21 +9,94 @@ import java.io.OutputStream;
/**
* 抽象压缩器
*
* @param <T> 压缩器类型
* @author 夜雨
* @version 2024-06-30 10:34
*/
public abstract class Compressor extends AbstractRunner {
public abstract class Compressor<T extends Compressor<T>> extends AbstractRunner<T> {
/** 源路径 */
private String fromPath;
/**
* 将指定路径下的文件压缩到目标文件
* 绑定源路径
*
* @param fromPath 源路径
* @return 当前压缩器
*/
protected T of(String fromPath) {
TimiException.required(fromPath, "not found fromPath");
this.fromPath = fromPath;
return self();
}
/**
* 绑定源文件
*
* @param fromFile 源文件
* @return 当前压缩器
*/
protected T of(File fromFile) {
TimiException.required(fromFile, "not found fromFile");
return of(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 toStream 目标输出流
* @return 当前压缩器
* @throws Exception 压缩失败
*/
public T toStream(OutputStream toStream) throws Exception {
toStream(requireFromPath(), toStream);
return self();
}
/**
* 获取已绑定的源路径
*
* @return 源路径
*/
protected String requireFromPath() {
TimiException.required(fromPath, "not found source");
return fromPath;
}
/**
* 执行压缩到目标文件
*
* @param fromPath 源路径
* @param toFile 目标压缩文件
* @throws Exception 压缩失败
*/
public void run(String fromPath, File toFile) throws Exception {
protected void toFile(String fromPath, File toFile) throws Exception {
try (OutputStream outputStream = IO.getOutputStream(toFile)) {
run(fromPath, outputStream);
toStream(fromPath, outputStream);
outputStream.flush();
} catch (Exception exception) {
if (isInterrupt) {
@@ -36,12 +110,11 @@ public abstract class Compressor extends AbstractRunner {
}
/**
* 将指定路径下的文件压缩到输出流
* 输出流由调用方管理
* 执行压缩到输出流
*
* @param fromPath 源路径
* @param toStream 目标输出流
* @throws Exception 压缩失败
*/
public abstract void run(String fromPath, OutputStream toStream) throws Exception;
protected abstract void toStream(String fromPath, OutputStream toStream) throws Exception;
}

View File

@@ -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;
@@ -8,31 +9,93 @@ import java.io.InputStream;
/**
* 抽象解压器
*
* @param <T> 解压器类型
* @author 夜雨
* @version 2024-06-30 18:02
*/
public abstract class Decompressor extends AbstractRunner {
public abstract class Decompressor<T extends Decompressor<T>> extends AbstractRunner<T> {
/** 源压缩文件 */
private File fromFile;
/** 源压缩输入流 */
private InputStream fromStream;
/**
* 压缩文件解压到目标目录
* 绑定源压缩文件
*
* @param fromFile 源压缩文件
* @return 当前解压器
*/
protected T of(File fromFile) {
TimiException.required(fromFile, "not found fromFile");
this.fromFile = fromFile;
this.fromStream = null;
return self();
}
/**
* 绑定源压缩文件路径
*
* @param fromPath 源压缩文件路径
* @return 当前解压器
*/
protected T of(String fromPath) {
TimiException.required(fromPath, "not found fromPath");
return of(new File(fromPath));
}
/**
* 绑定源压缩输入流
*
* @param fromStream 源压缩输入流
* @return 当前解压器
*/
public T of(InputStream fromStream) {
TimiException.required(fromStream, "not found fromStream");
this.fromStream = fromStream;
this.fromFile = null;
return self();
}
/**
* 解压到目标目录
*
* @param toPath 目标目录
* @return 当前解压器
* @throws Exception 解压失败
*/
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");
}
/**
* 执行从文件解压
*
* @param fromFile 源压缩文件
* @param toPath 目标目录
* @throws Exception 解压失败
*/
public void run(File fromFile, String toPath) throws Exception {
protected void toPath(File fromFile, String toPath) throws Exception {
try (InputStream inputStream = IO.getInputStream(fromFile)) {
run(inputStream, toPath);
toPath(inputStream, toPath);
}
}
/**
* 将压缩输入流解压到目标目录
* 输入流由调用方管理
* 执行从输入流解压
*
* @param fromStream 源压缩输入流
* @param toPath 目标目录
* @throws Exception 解压失败
*/
public abstract void run(InputStream fromStream, String toPath) throws Exception;
protected abstract void toPath(InputStream fromStream, String toPath) throws Exception;
}

View File

@@ -18,18 +18,38 @@ import java.util.List;
* @author 夜雨
* @version 2024-06-30 19:40
*/
public class GZipCompressor extends Compressor {
public class GZipCompressor extends Compressor<GZipCompressor> {
/**
* 创建压缩器
*
* @param fromPath 源路径
* @return 压缩器
*/
public static GZipCompressor from(String fromPath) {
return new GZipCompressor().of(fromPath);
}
/**
* 创建压缩器
*
* @param fromFile 源文件
* @return 压缩器
*/
public static GZipCompressor from(File fromFile) {
return new GZipCompressor().of(fromFile);
}
@Override
public void run(String fromPath, OutputStream toStream) throws Exception {
protected void toStream(String fromPath, OutputStream toStream) throws Exception {
File fromFile = new File(fromPath);
List<File> files = IO.listFile(fromFile);
String basePath = files.getFirst().getParentFile().getAbsolutePath();
initByteProgress(IO.calcSize(fromFile));
try (
GzipCompressorOutputStream gzipOutputStream = new GzipCompressorOutputStream(new BufferedOutputStream(nonClosing(toStream)));
TarArchiveOutputStream tarOutputStream = new TarArchiveOutputStream(gzipOutputStream)
) {
TarArchiveOutputStream tarOutputStream = null;
try {
tarOutputStream = new TarArchiveOutputStream(gzipOutputStream);
for (File sourceFile : files) {
String name = sourceFile.getAbsolutePath().substring(basePath.length() + 1);
TarArchiveEntry tarEntry = new TarArchiveEntry(sourceFile, normalizeEntryName(name));
@@ -41,9 +61,13 @@ public class GZipCompressor extends Compressor {
handleFile(sourceFile);
}
tarOutputStream.finish();
gzipOutputStream.finish();
finishProgress();
} finally {
if (tarOutputStream != null) {
tarOutputStream.close();
} else {
gzipOutputStream.close();
}
resetProgress();
}
}

View File

@@ -11,25 +11,54 @@ import java.io.OutputStream;
/**
* Gzip 解压器
* 当前实现保持与原行为一致,实际按 tar.gz 解压
*
* @author 夜雨
* @version 2024-06-30 19:47
*/
public class GZipDecompressor extends Decompressor {
public class GZipDecompressor extends Decompressor<GZipDecompressor> {
/**
* 创建解压器
*
* @param fromFile 源压缩文件
* @return 解压器
*/
public static GZipDecompressor from(File fromFile) {
return new GZipDecompressor().of(fromFile);
}
/**
* 创建解压器
*
* @param fromPath 源压缩文件路径
* @return 解压器
*/
public static GZipDecompressor from(String fromPath) {
return new GZipDecompressor().of(fromPath);
}
/**
* 创建解压器
*
* @param fromStream 源压缩输入流
* @return 解压器
*/
public static GZipDecompressor from(InputStream fromStream) {
return new GZipDecompressor().of(fromStream);
}
@Override
public void run(File fromFile, String toPath) throws Exception {
protected void toPath(File fromFile, String toPath) throws Exception {
initByteProgress(readTotalSize(fromFile));
try {
super.run(fromFile, toPath);
super.toPath(fromFile, toPath);
} finally {
resetProgress();
}
}
@Override
public void run(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)

View File

@@ -16,10 +16,30 @@ import java.util.List;
* @author 夜雨
* @version 2024-06-30 19:48
*/
public class TarCompressor extends Compressor {
public class TarCompressor extends Compressor<TarCompressor> {
/**
* 创建压缩器
*
* @param fromPath 源路径
* @return 压缩器
*/
public static TarCompressor from(String fromPath) {
return new TarCompressor().of(fromPath);
}
/**
* 创建压缩器
*
* @param fromFile 源文件
* @return 压缩器
*/
public static TarCompressor from(File fromFile) {
return new TarCompressor().of(fromFile);
}
@Override
public void run(String fromPath, OutputStream toStream) throws Exception {
protected void toStream(String fromPath, OutputStream toStream) throws Exception {
File fromFile = new File(fromPath);
List<File> files = IO.listFile(fromFile);
String basePath = files.getFirst().getParentFile().getAbsolutePath();

View File

@@ -14,20 +14,50 @@ import java.io.OutputStream;
* @author 夜雨
* @version 2024-06-30 19:48
*/
public class TarDecompressor extends Decompressor {
public class TarDecompressor extends Decompressor<TarDecompressor> {
/**
* 创建解压器
*
* @param fromFile 源压缩文件
* @return 解压器
*/
public static TarDecompressor from(File fromFile) {
return new TarDecompressor().of(fromFile);
}
/**
* 创建解压器
*
* @param fromPath 源压缩文件路径
* @return 解压器
*/
public static TarDecompressor from(String fromPath) {
return new TarDecompressor().of(fromPath);
}
/**
* 创建解压器
*
* @param fromStream 源压缩输入流
* @return 解压器
*/
public static TarDecompressor from(InputStream fromStream) {
return new TarDecompressor().of(fromStream);
}
@Override
public void run(File fromFile, String toPath) throws Exception {
protected void toPath(File fromFile, String toPath) throws Exception {
initByteProgress(readTotalSize(fromFile));
try {
super.run(fromFile, toPath);
super.toPath(fromFile, toPath);
} finally {
resetProgress();
}
}
@Override
public void run(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;

View File

@@ -17,13 +17,33 @@ import java.util.List;
* @author 夜雨
* @version 2024-06-30 19:40
*/
public class Z7Compressor extends Compressor {
public class Z7Compressor extends Compressor<Z7Compressor> {
/**
* 创建压缩器
*
* @param fromPath 源路径
* @return 压缩器
*/
public static Z7Compressor from(String fromPath) {
return new Z7Compressor().of(fromPath);
}
/**
* 创建压缩器
*
* @param fromFile 源文件
* @return 压缩器
*/
public static Z7Compressor from(File fromFile) {
return new Z7Compressor().of(fromFile);
}
@Override
public void run(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());
of(fromPath).toFile(tempFile.toFile());
try (InputStream inputStream = Files.newInputStream(tempFile)) {
transfer(inputStream, toStream, false);
toStream.flush();
@@ -34,7 +54,7 @@ public class Z7Compressor extends Compressor {
}
@Override
public void run(String fromPath, File toFile) throws Exception {
protected void toFile(String fromPath, File toFile) throws Exception {
File fromFile = new File(fromPath);
List<File> files = IO.listFile(fromFile);
String basePath = files.getFirst().getParentFile().getAbsolutePath();

View File

@@ -16,20 +16,50 @@ import java.nio.file.Path;
* @author 夜雨
* @version 2024-06-30 19:42
*/
public class Z7Decompressor extends Decompressor {
public class Z7Decompressor extends Decompressor<Z7Decompressor> {
/**
* 创建解压器
*
* @param fromFile 源压缩文件
* @return 解压器
*/
public static Z7Decompressor from(File fromFile) {
return new Z7Decompressor().of(fromFile);
}
/**
* 创建解压器
*
* @param fromPath 源压缩文件路径
* @return 解压器
*/
public static Z7Decompressor from(String fromPath) {
return new Z7Decompressor().of(fromPath);
}
/**
* 创建解压器
*
* @param fromStream 源压缩输入流
* @return 解压器
*/
public static Z7Decompressor from(InputStream fromStream) {
return new Z7Decompressor().of(fromStream);
}
@Override
public void run(File fromFile, String toPath) throws Exception {
protected void toPath(File fromFile, String toPath) throws Exception {
initByteProgress(readTotalSize(fromFile));
try {
super.run(fromFile, toPath);
super.toPath(fromFile, toPath);
} finally {
resetProgress();
}
}
@Override
public void run(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;

View File

@@ -16,10 +16,30 @@ import java.util.zip.ZipOutputStream;
* @author 夜雨
* @version 2024-06-30 19:46
*/
public class ZipCompressor extends Compressor {
public class ZipCompressor extends Compressor<ZipCompressor> {
/**
* 创建压缩器
*
* @param fromPath 源路径
* @return 压缩器
*/
public static ZipCompressor from(String fromPath) {
return new ZipCompressor().of(fromPath);
}
/**
* 创建压缩器
*
* @param fromFile 源文件
* @return 压缩器
*/
public static ZipCompressor from(File fromFile) {
return new ZipCompressor().of(fromFile);
}
@Override
public void run(String fromPath, OutputStream toStream) throws Exception {
protected void toStream(String fromPath, OutputStream toStream) throws Exception {
File fromFile = new File(fromPath);
List<File> files = IO.listFile(fromFile);
String basePath = files.getFirst().getParentFile().getAbsolutePath();

View File

@@ -16,20 +16,50 @@ import java.util.zip.ZipInputStream;
* @author 夜雨
* @version 2024-06-30 19:47
*/
public class ZipDecompressor extends Decompressor {
public class ZipDecompressor extends Decompressor<ZipDecompressor> {
/**
* 创建解压器
*
* @param fromFile 源压缩文件
* @return 解压器
*/
public static ZipDecompressor from(File fromFile) {
return new ZipDecompressor().of(fromFile);
}
/**
* 创建解压器
*
* @param fromPath 源压缩文件路径
* @return 解压器
*/
public static ZipDecompressor from(String fromPath) {
return new ZipDecompressor().of(fromPath);
}
/**
* 创建解压器
*
* @param fromStream 源压缩输入流
* @return 解压器
*/
public static ZipDecompressor from(InputStream fromStream) {
return new ZipDecompressor().of(fromStream);
}
@Override
public void run(File fromFile, String toPath) throws Exception {
protected void toPath(File fromFile, String toPath) throws Exception {
initByteProgress(readTotalSize(fromFile));
try {
super.run(fromFile, toPath);
super.toPath(fromFile, toPath);
} finally {
resetProgress();
}
}
@Override
public void run(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;

View File

@@ -1,12 +1,18 @@
package test;
import com.imyeyu.compress.CompressType;
import com.imyeyu.compress.GZipCompressor;
import com.imyeyu.compress.GZipDecompressor;
import com.imyeyu.io.IO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
/**
* @author 夜雨
@@ -15,35 +21,62 @@ import java.io.File;
public class GzipTest {
@Test
public void testCompress() throws Exception {
File out = IO.file("testOut/test.gz");
CompressType.GZIP.getCompressor().run("testSrc", out);
public void testStaticCompress() throws Exception {
GZipCompressor compressor = GZipCompressor.from("testSrc").toFile("testOut/test.gz");
Assertions.assertNotNull(compressor);
}
@Test
public void testChainCompress() throws Exception {
File out = IO.file("testOut/test-chain.gz");
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
GZipCompressor compressor = GZipCompressor.from("testSrc");
Assertions.assertSame(
compressor,
compressor
.fileCallback(file -> fileCount.incrementAndGet())
.progressCallback(progress::set)
.toFile(out)
);
Assertions.assertTrue(0 < fileCount.get());
Assertions.assertEquals(1D, progress.get());
}
@Test
public void testDecompress() throws Exception {
File in = IO.file("testOut/test.gz");
GZipCompressor.from("testSrc").toFile(in);
File out = IO.dir("testOutDe");
CompressType.fromFile(in).run(in, out.getAbsolutePath());
CompressType.from(in).toPath(out.getAbsolutePath());
}
@Test
public void testCompressToStream() throws Exception {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.GZIP.getCompressor().run("testSrc", outputStream);
try (OutputStream os = IO.getOutputStream(IO.file("testOut/test.tar.gz"))) {
CompressType.GZIP.compressFrom("testSrc").toStream(os);
}
}
@Test
public void testDecompressFromStream() throws Exception {
public void testChainDecompressFromStream() throws Exception {
byte[] bytes;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.GZIP.getCompressor().run("testSrc", outputStream);
CompressType.GZIP.compressFrom("testSrc").toStream(outputStream);
bytes = outputStream.toByteArray();
}
File out = IO.dir("testOutDeStream/gzip");
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
CompressType.GZIP.getDecompressor().run(inputStream, out.getAbsolutePath());
}
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
GZipDecompressor decompressor = GZipDecompressor.from(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());
}
}

View File

@@ -1,12 +1,18 @@
package test;
import com.imyeyu.compress.CompressType;
import com.imyeyu.compress.TarCompressor;
import com.imyeyu.compress.TarDecompressor;
import com.imyeyu.io.IO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
/**
* @author 夜雨
@@ -15,35 +21,62 @@ import java.io.File;
public class TarTest {
@Test
public void testCompress() throws Exception {
File out = IO.file("testOut/test.tar");
CompressType.TAR.getCompressor().run("testSrc", out);
public void testStaticCompress() throws Exception {
TarCompressor compressor = TarCompressor.from("testSrc").toFile("testOut/test.tar");
Assertions.assertNotNull(compressor);
}
@Test
public void testChainCompress() throws Exception {
File out = IO.file("testOut/test-chain.tar");
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
TarCompressor compressor = TarCompressor.from("testSrc");
Assertions.assertSame(
compressor,
compressor
.fileCallback(file -> fileCount.incrementAndGet())
.progressCallback(progress::set)
.toFile(out)
);
Assertions.assertTrue(0 < fileCount.get());
Assertions.assertEquals(1D, progress.get());
}
@Test
public void testDecompress() throws Exception {
File in = IO.file("testOut/test.tar");
TarCompressor.from("testSrc").toFile(in);
File out = IO.dir("testOutDe");
CompressType.fromFile(in).run(in, out.getAbsolutePath());
CompressType.from(in).toPath(out.getAbsolutePath());
}
@Test
public void testCompressToStream() throws Exception {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.TAR.getCompressor().run("testSrc", outputStream);
try (OutputStream os = IO.getOutputStream(IO.file("testOut/test.tar"))) {
CompressType.TAR.compressFrom("testSrc").toStream(os);
}
}
@Test
public void testDecompressFromStream() throws Exception {
public void testChainDecompressFromStream() throws Exception {
byte[] bytes;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.TAR.getCompressor().run("testSrc", outputStream);
CompressType.TAR.compressFrom("testSrc").toStream(outputStream);
bytes = outputStream.toByteArray();
}
File out = IO.dir("testOutDeStream/tar");
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
CompressType.TAR.getDecompressor().run(inputStream, out.getAbsolutePath());
}
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
TarDecompressor decompressor = TarDecompressor.from(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());
}
}

View File

@@ -1,12 +1,17 @@
package test;
import com.imyeyu.compress.CompressType;
import com.imyeyu.compress.Z7Compressor;
import com.imyeyu.compress.Z7Decompressor;
import com.imyeyu.io.IO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
/**
* @author 夜雨
@@ -15,35 +20,62 @@ import java.io.File;
public class Z7Test {
@Test
public void testCompress() throws Exception {
File out = IO.file("testOut/test.7z");
CompressType.Z7.getCompressor().run("testSrc", out);
public void testStaticCompress() throws Exception {
Z7Compressor compressor = Z7Compressor.from("testSrc").toFile("testOut/test.7z");
Assertions.assertNotNull(compressor);
}
@Test
public void testChainCompress() throws Exception {
File out = IO.file("testOut/test-chain.7z");
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
Z7Compressor compressor = Z7Compressor.from("testSrc");
Assertions.assertSame(
compressor,
compressor
.fileCallback(file -> fileCount.incrementAndGet())
.progressCallback(progress::set)
.toFile(out)
);
Assertions.assertTrue(0 < fileCount.get());
Assertions.assertEquals(1D, progress.get());
}
@Test
public void testDecompress() throws Exception {
File in = IO.file("testOut/test.7z");
Z7Compressor.from("testSrc").toFile(in);
File out = IO.dir("testOutDe");
CompressType.fromFile(in).run(in, out.getAbsolutePath());
CompressType.from(in).toPath(out.getAbsolutePath());
}
@Test
public void testCompressToStream() throws Exception {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.Z7.getCompressor().run("testSrc", outputStream);
CompressType.Z7.compressFrom("testSrc").toStream(outputStream);
}
}
@Test
public void testDecompressFromStream() throws Exception {
public void testChainDecompressFromStream() throws Exception {
byte[] bytes;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.Z7.getCompressor().run("testSrc", outputStream);
CompressType.Z7.compressFrom("testSrc").toStream(outputStream);
bytes = outputStream.toByteArray();
}
File out = IO.dir("testOutDeStream/z7");
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
CompressType.Z7.getDecompressor().run(inputStream, out.getAbsolutePath());
}
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
Z7Decompressor decompressor = Z7Decompressor.from(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());
}
}

View File

@@ -1,12 +1,17 @@
package test;
import com.imyeyu.compress.CompressType;
import com.imyeyu.compress.ZipCompressor;
import com.imyeyu.compress.ZipDecompressor;
import com.imyeyu.io.IO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
/**
* @author 夜雨
@@ -15,35 +20,62 @@ import java.io.File;
public class ZipTest {
@Test
public void testCompress() throws Exception {
File out = IO.file("testOut/test.zip");
CompressType.ZIP.getCompressor().run("testSrc", out);
public void testStaticCompress() throws Exception {
ZipCompressor compressor = ZipCompressor.from("testSrc").toFile("testOut/test.zip");
Assertions.assertNotNull(compressor);
}
@Test
public void testChainCompress() throws Exception {
File out = IO.file("testOut/test-chain.zip");
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
ZipCompressor compressor = ZipCompressor.from("testSrc");
Assertions.assertSame(
compressor,
compressor
.fileCallback(file -> fileCount.incrementAndGet())
.progressCallback(progress::set)
.toFile(out)
);
Assertions.assertTrue(0 < fileCount.get());
Assertions.assertEquals(1D, progress.get());
}
@Test
public void testDecompress() throws Exception {
File in = IO.file("testOut/test.zip");
ZipCompressor.from("testSrc").toFile(in);
File out = IO.dir("testOutDe");
CompressType.fromFile(in).run(in, out.getAbsolutePath());
CompressType.from(in).toPath(out.getAbsolutePath());
}
@Test
public void testCompressToStream() throws Exception {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.ZIP.getCompressor().run("testSrc", outputStream);
CompressType.ZIP.compressFrom("testSrc").toStream(outputStream);
}
}
@Test
public void testDecompressFromStream() throws Exception {
public void testChainDecompressFromStream() throws Exception {
byte[] bytes;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
CompressType.ZIP.getCompressor().run("testSrc", outputStream);
CompressType.ZIP.compressFrom("testSrc").toStream(outputStream);
bytes = outputStream.toByteArray();
}
File out = IO.dir("testOutDeStream/zip");
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
CompressType.ZIP.getDecompressor().run(inputStream, out.getAbsolutePath());
}
AtomicInteger fileCount = new AtomicInteger();
AtomicReference<Double> progress = new AtomicReference<>(0D);
ZipDecompressor decompressor = ZipDecompressor.from(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());
}
}