diff --git a/CHANGELOG.md b/CHANGELOG.md index 00729e860..58d538385 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,20 +5,23 @@ # 5.5.0 (2020-11-14) +### 大版本特性 +* 【extra 】 增加jakarta.validation-api封装:ValidationUtil(pr#207@Gitee) +* 【extra 】 增加表达式引擎封装:ExpressionUtil(pr#1203@Github) +* 【extra 】 新增基于Apache-FtpServer封装:SimpleFtpServer +* 【extra 】 新增基于Commons-Compress封装:CompressUtil + ### 新特性 * 【core 】 NumberUtil.parseInt等支持123,2.00这类数字(issue#I23ORQ@Gitee) * 【core 】 增加ArrayUtil.isSub、indexOfSub、lastIndexOfSub方法(issue#I23O1K@Gitee) -* 【extra 】 增加ValidationUtil(pr#207@Gitee) * 【core 】 反射调用支持传递参数的值为null(pr#1205@Github) * 【core 】 HexUtil增加format方法(issue#I245NF@Gitee) * 【poi 】 ExcelWriter增加setCurrentRowToEnd方法(issue#I24A2R@Gitee) * 【core 】 ExcelWriter增加setCurrentRowToEnd方法(issue#I24A2R@Gitee) -* 【extra 】 增加表达式引擎封装(ExpressionUtil)(pr#1203@Github) * 【core 】 增加enum转数字支持(issue#I24QZY@Gitee) * 【core 】 NumberUtil.toBigDecimal空白符转换为0(issue#I24MRP@Gitee) * 【core 】 CollUtil和IterUtil增加size方法(pr#208@Gitee) -* 【extra 】 新增SimpleFtpServer -* 【extra 】 新增CompressUtil压缩封装 +* 【poi 】 ExcelReader的read方法读取空单元格增加CellEditor处理(issue#1213@Github) ### Bug修复 * 【core 】 修复DateUtil.current使用System.nanoTime的问题(issue#1198@Github) diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java index 3479a5d8a..8cbdb7eb2 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java @@ -1,5 +1,6 @@ package cn.hutool.core.util; +import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Dict; import org.junit.Assert; import org.junit.Test; @@ -433,6 +434,14 @@ public class StrUtilTest { Assert.assertEquals(0, results2.length); } + @Test + public void subBetweenAllTest3() { + String src1 = "'abc'and'123'"; + + final String[] strings = StrUtil.subBetweenAll(src1, "'", "'"); + Console.log(strings); + } + @Test public void briefTest() { String str = RandomUtil.randomString(1000); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/CompressUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/CompressUtil.java index 07db936c7..fdd0cda3c 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/compress/CompressUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/compress/CompressUtil.java @@ -1,5 +1,7 @@ package cn.hutool.extra.compress; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.extra.compress.archiver.Archiver; import cn.hutool.extra.compress.archiver.SevenZArchiver; import cn.hutool.extra.compress.archiver.StreamArchiver; @@ -8,6 +10,10 @@ import cn.hutool.extra.compress.extractor.SenvenZExtractor; import cn.hutool.extra.compress.extractor.StreamExtractor; import org.apache.commons.compress.archivers.ArchiveStreamFactory; import org.apache.commons.compress.archivers.StreamingNotSupportedException; +import org.apache.commons.compress.compressors.CompressorException; +import org.apache.commons.compress.compressors.CompressorInputStream; +import org.apache.commons.compress.compressors.CompressorOutputStream; +import org.apache.commons.compress.compressors.CompressorStreamFactory; import java.io.File; import java.io.InputStream; @@ -23,6 +29,62 @@ import java.nio.charset.Charset; */ public class CompressUtil { + /** + * 获取压缩输出流,用于压缩指定内容,支持的格式例如: + * + * + * @param compressorName 压缩名称,见:{@link CompressorStreamFactory} + * @param out 输出流,可以输出到内存、网络或文件 + * @return {@link CompressorOutputStream} + */ + public CompressorOutputStream getOut(String compressorName, OutputStream out) { + try { + return new CompressorStreamFactory().createCompressorOutputStream(compressorName, out); + } catch (CompressorException e) { + throw new CompressException(e); + } + } + + /** + * 获取压缩输入流,用于解压缩指定内容,支持的格式例如: + * + * + * @param compressorName 压缩名称,见:{@link CompressorStreamFactory},null表示自动检测 + * @param in 输出流,可以输出到内存、网络或文件 + * @return {@link CompressorOutputStream} + */ + public CompressorInputStream getIn(String compressorName, InputStream in) { + in = IoUtil.toMarkSupportStream(in); + try { + if(StrUtil.isBlank(compressorName)){ + compressorName = CompressorStreamFactory.detect(in); + } + return new CompressorStreamFactory().createCompressorInputStream(compressorName, in); + } catch (CompressorException e) { + throw new CompressException(e); + } + } + /** * 创建归档器,支持: *