diff --git a/CHANGELOG.md b/CHANGELOG.md index becec1f42..274fe8c5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,15 +3,30 @@ ------------------------------------------------------------------------------------------------------------- -# 5.6.7 (2021-06-02) +# 5.6.8 (2021-06-09) + +### 🐣新特性 + +### 🐞Bug修复 + +------------------------------------------------------------------------------------------------------------- + +# 5.6.7 (2021-06-08) ### 🐣新特性 * 【core 】 CharSequenceUtil增加join重载(issue#I3TFJ5@Gitee) * 【http 】 HttpRequest增加form方法重载(pr#337@Gitee) +* 【http 】 ImgUtil增加getMainColor方法(pr#338@Gitee) +* 【core 】 改进TreeUtil.buid算法性能(pr#1594@Github) +* 【core 】 CsvConfig的setXXX返回this(issue#I3UIQF@Gitee) +* 【all 】 增加jmh基准测试 +* 【core 】 增加StreamUtil和CollectorUtil +* 【poi 】 增加content-type(pr#1639@Github) ### 🐞Bug修复 * 【core 】 修复FileUtil.normalize去掉末尾空格问题(issue#1603@Github) * 【core 】 修复CharsetDetector流关闭问题(issue#1603@Github) +* 【core 】 修复RuntimeUtil.exec引号内空格被切分的问题(issue#I3UAYB@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/README-EN.md b/README-EN.md index ec755393c..76a734d90 100644 --- a/README-EN.md +++ b/README-EN.md @@ -122,18 +122,18 @@ Each module can be introduced individually, or all modules can be introduced by cn.hutool hutool-all - 5.6.7 + 5.6.8 ``` ### 🍐Gradle ``` -compile 'cn.hutool:hutool-all:5.6.7' +compile 'cn.hutool:hutool-all:5.6.8' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.6.7/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.6.8/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index fcf8e8e85..23b9c6f21 100644 --- a/README.md +++ b/README.md @@ -120,20 +120,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.6.7 + 5.6.8 ``` ### 🍐Gradle ``` -compile 'cn.hutool:hutool-all:5.6.7' +compile 'cn.hutool:hutool-all:5.6.8' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.6.7/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.6.8/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index b3ae5c742..349e9d028 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.6.7 +5.6.8 diff --git a/docs/js/version.js b/docs/js/version.js index 4ee510599..ce09b9fd7 100644 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.6.7' \ No newline at end of file +var version = '5.6.8' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 951bfaa28..164498354 100644 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index 0c83856d3..8fb0925c5 100644 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 0e48b08d9..ce76d5f67 100644 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index d37e7723b..caedad348 100644 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 3d98d32ab..558a6b454 100644 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 3d07f06b3..e88a5cfed 100644 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 2c9f4cb30..9f28defa6 100644 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-core diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java index 1b97c84ff..5b32275dd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java @@ -273,19 +273,19 @@ public class BeanDesc implements Serializable { if (fieldName.startsWith("is")) { // 字段已经是is开头 if (methodName.equals(fieldName) // isName -》 isName - || methodName.equals("get" + handledFieldName)// isName -》 getIsName - || methodName.equals("is" + handledFieldName)// isName -》 isIsName + || ("get" + handledFieldName).equals(methodName)// isName -》 getIsName + || ("is" + handledFieldName).equals(methodName)// isName -》 isIsName ) { return true; } - } else if (methodName.equals("is" + handledFieldName)) { + } else if (("is" + handledFieldName).equals(methodName)) { // 字段非is开头, name -》 isName return true; } } // 包括boolean的任何类型只有一种匹配情况:name -》 getName - return methodName.equals("get" + handledFieldName); + return ("get" + handledFieldName).equals(methodName); } /** @@ -324,15 +324,15 @@ public class BeanDesc implements Serializable { // 针对Boolean类型特殊检查 if (isBooleanField && fieldName.startsWith("is")) { // 字段是is开头 - if (methodName.equals("set" + StrUtil.removePrefix(fieldName, "is"))// isName -》 setName - || methodName.equals("set" + handledFieldName)// isName -》 setIsName + if (("set" + StrUtil.removePrefix(fieldName, "is")).equals(methodName)// isName -》 setName + || ("set" + handledFieldName).equals(methodName)// isName -》 setIsName ) { return true; } } // 包括boolean的任何类型只有一种匹配情况:name -》 setName - return methodName.equals("set" + fieldName); + return ("set" + fieldName).equals(methodName); } // ------------------------------------------------------------------------------------------------------ Private method end } diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java b/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java index 6ca13c243..3913803b9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java @@ -938,7 +938,7 @@ public class HashCodeBuilder implements Builder { */ @Override public Integer build() { - return Integer.valueOf(toHashCode()); + return toHashCode(); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java index a70ec5a7d..457389202 100644 --- a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java +++ b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java @@ -132,7 +132,7 @@ public class Base64Encoder { * * @param arr 被编码的数组 * @param isMultiLine 在76个char之后是CRLF还是EOF - * @param isUrlSafe 是否使用URL安全字符,一般为{@code false} + * @param isUrlSafe 是否使用URL安全字符,在URL Safe模式下,=为URL中的关键字符,不需要补充。空余的byte位要去掉,一般为{@code false} * @return 编码后的bytes */ public static byte[] encode(byte[] arr, boolean isMultiLine, boolean isUrlSafe) { diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java b/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java index 16e0be430..403ba21c3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java +++ b/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java @@ -27,8 +27,8 @@ public class Morse { * @param dict 二进制 */ private static void registerMorse(Character abc, String dict) { - ALPHABETS.put(Integer.valueOf(abc), dict); - DICTIONARIES.put(dict, Integer.valueOf(abc)); + ALPHABETS.put((int) abc, dict); + DICTIONARIES.put(dict, (int) abc); } static { diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 7287eaf52..1c4353ea6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -510,6 +510,24 @@ public class CollUtil { return IterUtil.countMap(null == collection ? null : collection.iterator()); } + /** + * 以 conjunction 为分隔符将集合转换为字符串 + * + * @param 集合元素类型 + * @param iterable {@link Iterable} + * @param conjunction 分隔符 + * @param func 集合元素转换器,将元素转换为字符串 + * @return 连接后的字符串 + * @see IterUtil#join(Iterator, CharSequence, Function) + * @since 5.6.7 + */ + public static String join(Iterable iterable, CharSequence conjunction, Function func) { + if (null == iterable) { + return null; + } + return IterUtil.join(iterable.iterator(), conjunction, func); + } + /** * 以 conjunction 为分隔符将集合转换为字符串
* 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串 @@ -1617,9 +1635,9 @@ public class CollUtil { * @since 5.6.6 */ public static int lastIndexOf(Collection collection, Matcher matcher) { - if(collection instanceof List){ + if (collection instanceof List) { // List的查找最后一个有优化算法 - return ListUtil.lastIndexOf((List)collection, matcher); + return ListUtil.lastIndexOf((List) collection, matcher); } int matchIndex = -1; if (isNotEmpty(collection)) { @@ -2612,7 +2630,7 @@ public class CollUtil { * @since 5.4.7 */ public static void forEach(Iterable iterable, Consumer consumer) { - if(iterable == null){ + if (iterable == null) { return; } forEach(iterable.iterator(), consumer); @@ -2626,7 +2644,7 @@ public class CollUtil { * @param consumer {@link Consumer} 遍历的每条数据处理器 */ public static void forEach(Iterator iterator, Consumer consumer) { - if(iterator == null){ + if (iterator == null) { return; } int index = 0; @@ -2644,7 +2662,7 @@ public class CollUtil { * @param consumer {@link Consumer} 遍历的每条数据处理器 */ public static void forEach(Enumeration enumeration, Consumer consumer) { - if(enumeration == null){ + if (enumeration == null) { return; } int index = 0; @@ -2664,7 +2682,7 @@ public class CollUtil { * @param kvConsumer {@link KVConsumer} 遍历的每条数据处理器 */ public static void forEach(Map map, KVConsumer kvConsumer) { - if(map == null){ + if (map == null) { return; } int index = 0; @@ -2986,7 +3004,7 @@ public class CollUtil { * @author Looly */ @FunctionalInterface - public interface KVConsumer extends Serializable{ + public interface KVConsumer extends Serializable { /** * 接受并处理一对参数 * diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java index f2e6546f5..97d441c46 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java @@ -337,6 +337,31 @@ public class IterUtil { * @since 4.0.10 */ public static String join(Iterator iterator, CharSequence conjunction, String prefix, String suffix) { + return join(iterator, conjunction, (item)->{ + if (ArrayUtil.isArray(item)) { + return ArrayUtil.join(ArrayUtil.wrap(item), conjunction, prefix, suffix); + } else if (item instanceof Iterable) { + return join((Iterable) item, conjunction, prefix, suffix); + } else if (item instanceof Iterator) { + return join((Iterator) item, conjunction, prefix, suffix); + } else { + return StrUtil.wrap(String.valueOf(item), prefix, suffix); + } + }); + } + + /** + * 以 conjunction 为分隔符将集合转换为字符串
+ * 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串 + * + * @param 集合元素类型 + * @param iterator 集合 + * @param conjunction 分隔符 + * @param func 集合元素转换器,将元素转换为字符串 + * @return 连接后的字符串 + * @since 5.6.7 + */ + public static String join(Iterator iterator, CharSequence conjunction, Function func) { if (null == iterator) { return null; } @@ -352,15 +377,7 @@ public class IterUtil { } item = iterator.next(); - if (ArrayUtil.isArray(item)) { - sb.append(ArrayUtil.join(ArrayUtil.wrap(item), conjunction, prefix, suffix)); - } else if (item instanceof Iterable) { - sb.append(join((Iterable) item, conjunction, prefix, suffix)); - } else if (item instanceof Iterator) { - sb.append(join((Iterator) item, conjunction, prefix, suffix)); - } else { - sb.append(StrUtil.wrap(String.valueOf(item), prefix, suffix)); - } + sb.append(func.apply(item)); } return sb.toString(); } @@ -826,7 +843,7 @@ public class IterUtil { * @since 5.5.0 */ public static int size(final Iterable iterable) { - if(null == iterable){ + if (null == iterable) { return 0; } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 3b00caf5e..59f942430 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; /** * 时间工具类 @@ -931,7 +930,6 @@ public class DateUtil extends CalendarUtil { //标准日期格式(包括单个数字的日期时间) dateStr = normalize(dateStr); - final Matcher matcher = DatePattern.REGEX_NORM.matcher(dateStr); if (ReUtil.isMatch(DatePattern.REGEX_NORM, dateStr)) { final int colonCount = StrUtil.count(dateStr, CharUtil.COLON); switch (colonCount) { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java b/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java index b69e32b86..4d60f18f4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java @@ -299,7 +299,7 @@ public class FastDatePrinter extends AbstractDateBasic implements DatePrinter { } else if (obj instanceof Calendar) { return format((Calendar) obj); } else if (obj instanceof Long) { - return format(((Long) obj).longValue()); + return format(((Long) obj)); } else { throw new IllegalArgumentException("Unknown class: " + (obj == null ? "" : obj.getClass().getName())); } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/format/FormatCache.java b/hutool-core/src/main/java/cn/hutool/core/date/format/FormatCache.java index 2cc136020..68da7e21f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/format/FormatCache.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/format/FormatCache.java @@ -113,7 +113,7 @@ abstract class FormatCache { */ // package protected, for access from FastDateFormat; do not make public or protected F getDateTimeInstance(final int dateStyle, final int timeStyle, final TimeZone timeZone, final Locale locale) { - return getDateTimeInstance(Integer.valueOf(dateStyle), Integer.valueOf(timeStyle), timeZone, locale); + return getDateTimeInstance(dateStyle, timeStyle, timeZone, locale); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/exceptions/package-info.java b/hutool-core/src/main/java/cn/hutool/core/exceptions/package-info.java index 82edebe41..3248a1436 100644 --- a/hutool-core/src/main/java/cn/hutool/core/exceptions/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/exceptions/package-info.java @@ -1,6 +1,6 @@ /** * 特殊异常封装,同时提供异常工具ExceptionUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/ArrayTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/ArrayTypeGetter.java index a29a6c7a6..67b8949b4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/ArrayTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/ArrayTypeGetter.java @@ -10,93 +10,93 @@ import java.math.BigInteger; */ public interface ArrayTypeGetter { /*-------------------------- 数组类型 start -------------------------------*/ - + /** * 获取Object型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ String[] getObjs(String key); - + /** * 获取String型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ String[] getStrs(String key); - + /** * 获取Integer型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ Integer[] getInts(String key); - + /** * 获取Short型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ Short[] getShorts(String key); - + /** * 获取Boolean型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ Boolean[] getBools(String key); - + /** * 获取Long型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ Long[] getLongs(String key); - + /** * 获取Character型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ Character[] getChars(String key); - + /** * 获取Double型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ Double[] getDoubles(String key); - + /** * 获取Byte型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ Byte[] getBytes(String key); - + /** * 获取BigInteger型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ BigInteger[] getBigIntegers(String key); - + /** * 获取BigDecimal型属性值数组 - * + * * @param key 属性名 * @return 属性值列表 */ BigDecimal[] getBigDecimals(String key); - /*-------------------------- 数组类型 end -------------------------------*/ + /*-------------------------- 数组类型 end -------------------------------*/ } diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/BasicTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/BasicTypeGetter.java index a3a81a20f..71c86cb3a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/BasicTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/BasicTypeGetter.java @@ -7,7 +7,7 @@ import java.util.Date; /** * 基本类型的getter接口
* 提供一个统一的接口定义返回不同类型的值(基本类型)
- * + * * @author Looly */ public interface BasicTypeGetter { @@ -15,7 +15,7 @@ public interface BasicTypeGetter { /** * 获取Object属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -23,7 +23,7 @@ public interface BasicTypeGetter { /** * 获取字符串型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -31,7 +31,7 @@ public interface BasicTypeGetter { /** * 获取int型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -39,7 +39,7 @@ public interface BasicTypeGetter { /** * 获取short型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -47,7 +47,7 @@ public interface BasicTypeGetter { /** * 获取boolean型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -55,7 +55,7 @@ public interface BasicTypeGetter { /** * 获取long型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -63,7 +63,7 @@ public interface BasicTypeGetter { /** * 获取char型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -71,7 +71,7 @@ public interface BasicTypeGetter { /** * 获取float型属性值
- * + * * @param key 属性名 * @return 属性值 */ @@ -79,7 +79,7 @@ public interface BasicTypeGetter { /** * 获取double型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -87,7 +87,7 @@ public interface BasicTypeGetter { /** * 获取byte型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -95,7 +95,7 @@ public interface BasicTypeGetter { /** * 获取BigDecimal型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -103,7 +103,7 @@ public interface BasicTypeGetter { /** * 获取BigInteger型属性值 - * + * * @param key 属性名 * @return 属性值 */ @@ -111,7 +111,7 @@ public interface BasicTypeGetter { /** * 获得Enum类型的值 - * + * * @param 枚举类型 * @param clazz Enum的Class * @param key KEY @@ -121,7 +121,7 @@ public interface BasicTypeGetter { /** * 获取Date类型值 - * + * * @param key 属性名 * @return Date类型属性值 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/GroupedTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/GroupedTypeGetter.java index 4f5743d9a..c82f28777 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/GroupedTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/GroupedTypeGetter.java @@ -12,88 +12,88 @@ public interface GroupedTypeGetter { /*-------------------------- 基本类型 start -------------------------------*/ /** * 获取字符串型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ String getStrByGroup(String key, String group); - + /** * 获取int型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ Integer getIntByGroup(String key, String group); - + /** * 获取short型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ Short getShortByGroup(String key, String group); - + /** * 获取boolean型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ Boolean getBoolByGroup(String key, String group); - + /** * 获取Long型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ Long getLongByGroup(String key, String group); - + /** * 获取char型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ Character getCharByGroup(String key, String group); - + /** * 获取double型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ Double getDoubleByGroup(String key, String group); - + /** * 获取byte型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ Byte getByteByGroup(String key, String group); - + /** * 获取BigDecimal型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 */ BigDecimal getBigDecimalByGroup(String key, String group); - + /** * 获取BigInteger型属性值
- * + * * @param key 属性名 * @param group 分组 * @return 属性值 diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/ListTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/ListTypeGetter.java index 543aa5be6..432cc0659 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/ListTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/ListTypeGetter.java @@ -13,7 +13,7 @@ public interface ListTypeGetter { /*-------------------------- List类型 start -------------------------------*/ /** * 获取Object型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ @@ -21,79 +21,79 @@ public interface ListTypeGetter { /** * 获取String型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getStrList(String key); - + /** * 获取Integer型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getIntList(String key); - + /** * 获取Short型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getShortList(String key); - + /** * 获取Boolean型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getBoolList(String key); - + /** * 获取BigDecimal型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getLongList(String key); - + /** * 获取Character型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getCharList(String key); - + /** * 获取Double型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getDoubleList(String key); - + /** * 获取Byte型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getByteList(String key); - + /** * 获取BigDecimal型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ List getBigDecimalList(String key); - + /** * 获取BigInteger型属性值列表 - * + * * @param key 属性名 * @return 属性值列表 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptArrayTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptArrayTypeGetter.java index ea096083c..99e688d7b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptArrayTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptArrayTypeGetter.java @@ -7,7 +7,7 @@ import java.math.BigInteger; * 可选默认值的数组类型的Get接口 * 提供一个统一的接口定义返回不同类型的值(基本类型)
* 如果值不存在或获取错误,返回默认值 - * + * * @author Looly * @since 4.0.2 * @@ -17,7 +17,7 @@ public interface OptArrayTypeGetter { /** * 获取Object型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -26,7 +26,7 @@ public interface OptArrayTypeGetter { /** * 获取String型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -35,7 +35,7 @@ public interface OptArrayTypeGetter { /** * 获取Integer型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -44,7 +44,7 @@ public interface OptArrayTypeGetter { /** * 获取Short型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -53,7 +53,7 @@ public interface OptArrayTypeGetter { /** * 获取Boolean型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -62,7 +62,7 @@ public interface OptArrayTypeGetter { /** * 获取Long型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -71,7 +71,7 @@ public interface OptArrayTypeGetter { /** * 获取Character型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -80,7 +80,7 @@ public interface OptArrayTypeGetter { /** * 获取Double型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -89,7 +89,7 @@ public interface OptArrayTypeGetter { /** * 获取Byte型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -98,7 +98,7 @@ public interface OptArrayTypeGetter { /** * 获取BigInteger型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 @@ -107,7 +107,7 @@ public interface OptArrayTypeGetter { /** * 获取BigDecimal型属性值数组 - * + * * @param key 属性名 * @param defaultValue 默认数组值 * @return 属性值列表 diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptBasicTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptBasicTypeGetter.java index 42393b46d..073fd66d1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptBasicTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptBasicTypeGetter.java @@ -12,7 +12,7 @@ import java.util.Date; */ public interface OptBasicTypeGetter { /*-------------------------- 基本类型 start -------------------------------*/ - + /** * 获取Object属性值 * @param key 属性名 @@ -20,120 +20,120 @@ public interface OptBasicTypeGetter { * @return 属性值,无对应值返回defaultValue */ Object getObj(K key, Object defaultValue); - + /** * 获取字符串型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ String getStr(K key, String defaultValue); - + /** * 获取int型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Integer getInt(K key, Integer defaultValue); - + /** * 获取short型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Short getShort(K key, Short defaultValue); - + /** * 获取boolean型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Boolean getBool(K key, Boolean defaultValue); - + /** * 获取Long型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Long getLong(K key, Long defaultValue); - + /** * 获取char型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Character getChar(K key, Character defaultValue); - + /** * 获取float型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Float getFloat(K key, Float defaultValue); - + /** * 获取double型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Double getDouble(K key, Double defaultValue); - + /** * 获取byte型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ Byte getByte(K key, Byte defaultValue); - + /** * 获取BigDecimal型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ BigDecimal getBigDecimal(K key, BigDecimal defaultValue); - + /** * 获取BigInteger型属性值
* 若获得的值为不可见字符,使用默认值 - * + * * @param key 属性名 * @param defaultValue 默认值 * @return 属性值,无对应值返回defaultValue */ BigInteger getBigInteger(K key, BigInteger defaultValue); - + /** * 获得Enum类型的值 - * + * * @param 枚举类型 * @param clazz Enum的Class * @param key KEY @@ -141,7 +141,7 @@ public interface OptBasicTypeGetter { * @return Enum类型的值,无则返回Null */ > E getEnum(Class clazz, K key, E defaultValue); - + /** * 获取Date类型值 * @param key 属性名 diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java index d9d85514d..3c55b7dc1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java @@ -16,11 +16,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Object getObj(K key) { return getObj(key, null); } - + /** * 获取字符串型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -28,11 +28,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default String getStr(K key){ return this.getStr(key, null); } - + /** * 获取int型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -40,11 +40,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Integer getInt(K key) { return this.getInt(key, null); } - + /** * 获取short型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -52,11 +52,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Short getShort(K key){ return this.getShort(key, null); } - + /** * 获取boolean型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -64,11 +64,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Boolean getBool(K key){ return this.getBool(key, null); } - + /** * 获取long型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -76,11 +76,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Long getLong(K key){ return this.getLong(key, null); } - + /** * 获取char型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -88,11 +88,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Character getChar(K key){ return this.getChar(key, null); } - + /** * 获取float型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -100,11 +100,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Float getFloat(K key){ return this.getFloat(key, null); } - + /** * 获取double型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -116,7 +116,7 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT /** * 获取byte型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -124,11 +124,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default Byte getByte(K key){ return this.getByte(key, null); } - + /** * 获取BigDecimal型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -136,11 +136,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default BigDecimal getBigDecimal(K key){ return this.getBigDecimal(key, null); } - + /** * 获取BigInteger型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ @@ -148,11 +148,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default BigInteger getBigInteger(K key){ return this.getBigInteger(key, null); } - + /** * 获取Enum型属性值
* 无值或获取错误返回null - * + * * @param clazz Enum 的 Class * @param key 属性名 * @return 属性值 @@ -161,11 +161,11 @@ public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicT default > E getEnum(Class clazz, K key) { return this.getEnum(clazz, key, null); } - + /** * 获取Date型属性值
* 无值或获取错误返回null - * + * * @param key 属性名 * @return 属性值 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/package-info.java b/hutool-core/src/main/java/cn/hutool/core/getter/package-info.java index ab201f395..ae44c1b0c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/package-info.java @@ -1,6 +1,6 @@ /** * getXXX方法的接口和抽象实现 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java index 9dcbfa410..b75e32e70 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java @@ -43,8 +43,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Random; /** @@ -1164,7 +1166,7 @@ public class ImgUtil { * @since 4.3.2 */ public static BufferedImage toBufferedImage(Image image, String imageType) { - final int type = imageType.equalsIgnoreCase(IMAGE_TYPE_PNG) + final int type = IMAGE_TYPE_PNG.equalsIgnoreCase(imageType) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB; return toBufferedImage(image, type); @@ -1724,7 +1726,7 @@ public class ImgUtil { } if (null == result) { - throw new IllegalArgumentException("Image type of [" + imageUrl.toString() + "] is not supported!"); + throw new IllegalArgumentException("Image type of [" + imageUrl + "] is not supported!"); } return result; @@ -2002,6 +2004,57 @@ public class ImgUtil { ); } + /** + * 获取给定图片的主色调,背景填充用 + * + * @param image {@link BufferedImage} + * @param rgbFilters 过滤多种颜色 + * @return {@link String} #ffffff + * @since 5.6.7 + */ + public static String getMainColor(BufferedImage image, int[]... rgbFilters) { + int r, g, b; + Map countMap = new HashMap<>(); + int width = image.getWidth(); + int height = image.getHeight(); + int minx = image.getMinX(); + int miny = image.getMinY(); + for (int i = minx; i < width; i++) { + for (int j = miny; j < height; j++) { + int pixel = image.getRGB(i, j); + r = (pixel & 0xff0000) >> 16; + g = (pixel & 0xff00) >> 8; + b = (pixel & 0xff); + if (rgbFilters != null && rgbFilters.length > 0) { + for (int[] rgbFilter : rgbFilters) { + if (r == rgbFilter[0] && g == rgbFilter[1] && b == rgbFilter[2]) { + break; + } + } + } + countMap.merge(r + "-" + g + "-" + b, 1L, Long::sum); + } + } + String maxColor = null; + long maxCount = 0; + for (Map.Entry entry : countMap.entrySet()) { + String key = entry.getKey(); + Long count = entry.getValue(); + if (count > maxCount) { + maxColor = key; + maxCount = count; + } + } + final String[] splitRgbStr = StrUtil.splitToArray(maxColor, '-'); + String rHex = Integer.toHexString(Integer.parseInt(splitRgbStr[0])); + String gHex = Integer.toHexString(Integer.parseInt(splitRgbStr[1])); + String bHex = Integer.toHexString(Integer.parseInt(splitRgbStr[2])); + rHex = rHex.length() == 1 ? "0" + rHex : rHex; + gHex = gHex.length() == 1 ? "0" + gHex : gHex; + bHex = bHex.length() == 1 ? "0" + bHex : bHex; + return "#" + rHex + gHex + bHex; + } + // ------------------------------------------------------------------------------------------------------ 背景图换算 /** diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java b/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java index a40823a7f..670d9b83d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java @@ -4,7 +4,7 @@ import java.awt.Image; /** * 图片缩略算法类型 - * + * * @author looly * @since 4.5.8 */ @@ -23,7 +23,7 @@ public enum ScaleType { /** * 构造 - * + * * @param value 缩放方式 * @see Image#SCALE_DEFAULT * @see Image#SCALE_FAST diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/GifDecoder.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/GifDecoder.java index 685a8e7d5..038d2db2f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/gif/GifDecoder.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/gif/GifDecoder.java @@ -778,9 +778,6 @@ public class GifDecoder { lastRect = new Rectangle(ix, iy, iw, ih); lastImage = image; lastBgColor = bgColor; - int dispose = 0; - boolean transparency = false; - int delay = 0; lct = null; } diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/LZWEncoder.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/LZWEncoder.java index f9f9a7b77..129821b91 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/gif/LZWEncoder.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/gif/LZWEncoder.java @@ -125,7 +125,7 @@ class LZWEncoder { pixAry = pixels; initCodeSize = Math.max(2, color_depth); } - + // Add a character to the end of the current packet, and if it is 254 // characters, flush the packet to disk. void char_out(byte c, OutputStream outs) throws IOException { @@ -133,7 +133,7 @@ class LZWEncoder { if (a_count >= 254) flush_char(outs); } - + // Clear out the hash table // table clear for block compress @@ -144,13 +144,13 @@ class LZWEncoder { output(ClearCode, outs); } - + // reset code table void cl_hash(int hsize) { for (int i = 0; i < hsize; ++i) htab[i] = -1; } - + void compress(int init_bits, OutputStream outs) throws IOException { int fcode; int i /* = 0 */; @@ -220,7 +220,7 @@ class LZWEncoder { output(ent, outs); output(EOFCode, outs); } - + //---------------------------------------------------------------------------- void encode(OutputStream os) throws IOException { os.write(initCodeSize); // write "initial code size" byte @@ -232,7 +232,7 @@ class LZWEncoder { os.write(0); // write block terminator } - + // Flush the packet to disk, and reset the accumulator void flush_char(OutputStream outs) throws IOException { if (a_count > 0) { @@ -241,11 +241,11 @@ class LZWEncoder { a_count = 0; } } - + final int MAXCODE(int n_bits) { return (1 << n_bits) - 1; } - + //---------------------------------------------------------------------------- // Return the next pixel from the image //---------------------------------------------------------------------------- @@ -259,7 +259,7 @@ class LZWEncoder { return pix & 0xff; } - + void output(int code, OutputStream outs) throws IOException { cur_accum &= masks[cur_bits]; diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java index e7b5f9b6d..09faae944 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java @@ -350,10 +350,7 @@ public class NeuQuant { /* Unbias network to give byte values 0..255 and record position i to prepare for sort ----------------------------------------------------------------------------------- */ public void unbiasnet() { - - int i, j; - - for (i = 0; i < NETSIZE; i++) { + for (int i = 0; i < NETSIZE; i++) { network[i][0] >>= NETBIASSHIFT; network[i][1] >>= NETBIASSHIFT; network[i][2] >>= NETBIASSHIFT; diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/package-info.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/package-info.java index 0d53fc2f9..da908de42 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/gif/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/gif/package-info.java @@ -1,6 +1,6 @@ /** * GIF处理,来自:https://github.com/rtyley/animated-gif-lib-for-java - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/img/package-info.java b/hutool-core/src/main/java/cn/hutool/core/img/package-info.java index 2c1c8535b..7a921125d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/package-info.java @@ -1,6 +1,6 @@ /** * 图像处理相关工具类封装 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FastByteArrayOutputStream.java b/hutool-core/src/main/java/cn/hutool/core/io/FastByteArrayOutputStream.java index 6ac77439e..43d6cf20a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FastByteArrayOutputStream.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FastByteArrayOutputStream.java @@ -28,7 +28,7 @@ public class FastByteArrayOutputStream extends OutputStream { /** * 构造 - * + * * @param size 预估大小 */ public FastByteArrayOutputStream(int size) { @@ -80,7 +80,7 @@ public class FastByteArrayOutputStream extends OutputStream { } } - + /** * 转为Byte数组 * @return Byte数组 @@ -102,7 +102,7 @@ public class FastByteArrayOutputStream extends OutputStream { public String toString(String charsetName) { return toString(CharsetUtil.charset(charsetName)); } - + /** * 转为字符串 * @param charset 编码,null表示默认编码 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FastByteBuffer.java b/hutool-core/src/main/java/cn/hutool/core/io/FastByteBuffer.java index eecf5bd3d..17dae9af7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FastByteBuffer.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FastByteBuffer.java @@ -49,7 +49,7 @@ public class FastByteBuffer { /** * 分配下一个缓冲区,不会小于1024 - * + * * @param newSize 理想缓冲区字节数 */ private void needNewBuffer(int newSize) { @@ -73,7 +73,7 @@ public class FastByteBuffer { /** * 向快速缓冲加入数据 - * + * * @param array 数据 * @param off 偏移量 * @param len 字节数 @@ -117,9 +117,9 @@ public class FastByteBuffer { /** * 向快速缓冲加入数据 - * + * * @param array 数据 - * + * * @return 快速缓冲自身 @see FastByteBuffer */ public FastByteBuffer append(byte[] array) { @@ -128,7 +128,7 @@ public class FastByteBuffer { /** * 向快速缓冲加入一个字节 - * + * * @param element 一个字节的数据 * @return 快速缓冲自身 @see FastByteBuffer */ @@ -146,7 +146,7 @@ public class FastByteBuffer { /** * 将另一个快速缓冲加入到自身 - * + * * @param buff 快速缓冲 * @return 快速缓冲自身 @see FastByteBuffer */ @@ -171,7 +171,7 @@ public class FastByteBuffer { /** * 当前缓冲位于缓冲区的索引位 - * + * * @return {@link #currentBufferIndex} */ public int index() { @@ -184,7 +184,7 @@ public class FastByteBuffer { /** * 根据索引位返回缓冲集中的缓冲 - * + * * @param index 索引位 * @return 缓冲 */ @@ -202,7 +202,7 @@ public class FastByteBuffer { /** * 返回快速缓冲中的数据 - * + * * @return 快速缓冲中的数据 */ public byte[] toArray() { @@ -226,7 +226,7 @@ public class FastByteBuffer { /** * 返回快速缓冲中的数据 - * + * * @param start 逻辑起始位置 * @param len 逻辑字节长 * @return 快速缓冲中的数据 @@ -263,7 +263,7 @@ public class FastByteBuffer { /** * 根据索引位返回一个字节 - * + * * @param index 索引位 * @return 一个字节 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/IORuntimeException.java b/hutool-core/src/main/java/cn/hutool/core/io/IORuntimeException.java index efa6a56c0..e6f964541 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/IORuntimeException.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/IORuntimeException.java @@ -5,7 +5,7 @@ import cn.hutool.core.util.StrUtil; /** * IO运行时异常,常用于对IOException的包装 - * + * * @author xiaoleilu */ public class IORuntimeException extends RuntimeException { @@ -33,7 +33,7 @@ public class IORuntimeException extends RuntimeException { /** * 导致这个异常的异常是否是指定类型的异常 - * + * * @param clazz 异常类 * @return 是否为指定类型异常 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/NullOutputStream.java b/hutool-core/src/main/java/cn/hutool/core/io/NullOutputStream.java index 40f3f0e5e..f25ef8700 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/NullOutputStream.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/NullOutputStream.java @@ -6,7 +6,7 @@ import java.io.OutputStream; /** * 此OutputStream写出数据到/dev/null,即忽略所有数据
* 来自 Apache Commons io - * + * * @author looly * @since 4.0.6 */ @@ -19,7 +19,7 @@ public class NullOutputStream extends OutputStream { /** * 什么也不做,写出到/dev/null. - * + * * @param b 写出的数据 * @param off 开始位置 * @param len 长度 @@ -31,7 +31,7 @@ public class NullOutputStream extends OutputStream { /** * 什么也不做,写出到 /dev/null. - * + * * @param b 写出的数据 */ @Override @@ -41,7 +41,7 @@ public class NullOutputStream extends OutputStream { /** * 什么也不做,写出到 /dev/null. - * + * * @param b 写出的数据 * @throws IOException 不抛出 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/StreamProgress.java b/hutool-core/src/main/java/cn/hutool/core/io/StreamProgress.java index 61aacafd1..5e3a99559 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/StreamProgress.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/StreamProgress.java @@ -6,18 +6,18 @@ package cn.hutool.core.io; * */ public interface StreamProgress { - + /** * 开始 */ void start(); - + /** * 进行中 * @param progressSize 已经进行的大小 */ void progress(long progressSize); - + /** * 结束 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/checksum/crc16/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/checksum/crc16/package-info.java index 509c12c8d..c881e7f7f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/checksum/crc16/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/checksum/crc16/package-info.java @@ -1,6 +1,6 @@ /** * CRC16相关算法封装为Checksum - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/checksum/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/checksum/package-info.java index ddc54dfdf..bc1ae41dc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/checksum/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/checksum/package-info.java @@ -1,6 +1,6 @@ /** * IO校验相关库和工具 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java index d8875b5a9..4d2091c96 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java @@ -14,7 +14,7 @@ import java.util.List; * 持有一个文件,在内存中积累一定量的数据后统一追加到文件
* 此类只有在写入文件时打开文件,并在写入结束后关闭之。因此此类不需要关闭
* 在调用append方法后会缓存于内存,只有超过容量后才会一次性写入文件,因此内存中随时有剩余未写入文件的内容,在最后必须调用flush方法将剩余内容刷入文件 - * + * * @author looly * @since 3.1.2 */ @@ -27,10 +27,10 @@ public class FileAppender implements Serializable{ /** 追加内容是否为新行 */ private final boolean isNewLineMode; private final List list = new ArrayList<>(100); - + /** * 构造 - * + * * @param destFile 目标文件 * @param capacity 当行数积累多少条时刷入到文件 * @param isNewLineMode 追加内容是否为新行 @@ -41,7 +41,7 @@ public class FileAppender implements Serializable{ /** * 构造 - * + * * @param destFile 目标文件 * @param charset 编码 * @param capacity 当行数积累多少条时刷入到文件 @@ -55,7 +55,7 @@ public class FileAppender implements Serializable{ /** * 追加 - * + * * @param line 行 * @return this */ @@ -69,7 +69,7 @@ public class FileAppender implements Serializable{ /** * 刷入到文件 - * + * * @return this */ public FileAppender flush() { diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileCopier.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileCopier.java index 534bb7ad4..fbdc4938f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileCopier.java @@ -23,13 +23,13 @@ import java.util.ArrayList; * 3、目录复制到目录 * 4、目录下的文件和目录复制到另一个目录 * - * + * * @author Looly * @since 3.0.9 */ public class FileCopier extends SrcToDestCopier{ private static final long serialVersionUID = 1L; - + /** 是否覆盖目标文件 */ private boolean isOverride; /** 是否拷贝所有属性 */ @@ -38,7 +38,7 @@ public class FileCopier extends SrcToDestCopier{ private boolean isCopyContentIfDir; /** 当拷贝来源是目录时是否只拷贝文件而忽略子目录 */ private boolean isOnlyCopyFile; - + //-------------------------------------------------------------------------------------------------------- static method start /** * 新建一个文件复制器 @@ -49,7 +49,7 @@ public class FileCopier extends SrcToDestCopier{ public static FileCopier create(String srcPath, String destPath) { return new FileCopier(FileUtil.file(srcPath), FileUtil.file(destPath)); } - + /** * 新建一个文件复制器 * @param src 源文件 @@ -60,7 +60,7 @@ public class FileCopier extends SrcToDestCopier{ return new FileCopier(src, dest); } //-------------------------------------------------------------------------------------------------------- static method end - + //-------------------------------------------------------------------------------------------------------- Constructor start /** * 构造 @@ -72,7 +72,7 @@ public class FileCopier extends SrcToDestCopier{ this.dest = dest; } //-------------------------------------------------------------------------------------------------------- Constructor end - + //-------------------------------------------------------------------------------------------------------- Getters and Setters start /** * 是否覆盖目标文件 @@ -115,7 +115,7 @@ public class FileCopier extends SrcToDestCopier{ public boolean isCopyContentIfDir() { return isCopyContentIfDir; } - + /** * 当拷贝来源是目录时是否只拷贝目录下的内容 * @param isCopyContentIfDir 是否只拷贝目录下的内容 @@ -125,10 +125,10 @@ public class FileCopier extends SrcToDestCopier{ this.isCopyContentIfDir = isCopyContentIfDir; return this; } - + /** * 当拷贝来源是目录时是否只拷贝文件而忽略子目录 - * + * * @return 当拷贝来源是目录时是否只拷贝文件而忽略子目录 * @since 4.1.5 */ @@ -138,7 +138,7 @@ public class FileCopier extends SrcToDestCopier{ /** * 设置当拷贝来源是目录时是否只拷贝文件而忽略子目录 - * + * * @param isOnlyCopyFile 当拷贝来源是目录时是否只拷贝文件而忽略子目录 * @return this * @since 4.1.5 @@ -161,7 +161,7 @@ public class FileCopier extends SrcToDestCopier{ * 6、源为目录,目标为文件,抛出IO异常 * 7、源路径和目标路径相同时,抛出IO异常 * - * + * * @return 拷贝后目标的文件或目录 * @throws IORuntimeException IO异常 */ @@ -187,7 +187,7 @@ public class FileCopier extends SrcToDestCopier{ if(FileUtil.isSub(src, dest)) { throw new IORuntimeException("Dest is a sub directory of src !"); } - + final File subTarget = isCopyContentIfDir ? dest : FileUtil.mkdir(FileUtil.file(dest, src.getName())); internalCopyDirContent(src, subTarget); } else {// 复制文件 @@ -200,7 +200,7 @@ public class FileCopier extends SrcToDestCopier{ /** * 拷贝目录内容,只用于内部,不做任何安全检查
* 拷贝内容的意思为源目录下的所有文件和目录拷贝到另一个目录下,而不拷贝源目录本身 - * + * * @param src 源目录 * @param dest 目标目录 * @throws IORuntimeException IO异常 @@ -218,7 +218,7 @@ public class FileCopier extends SrcToDestCopier{ } else if (false == dest.isDirectory()) { throw new IORuntimeException(StrUtil.format("Src [{}] is a directory but dest [{}] is a file!", src.getPath(), dest.getPath())); } - + final String[] files = src.list(); if(ArrayUtil.isNotEmpty(files)){ File srcFile; @@ -243,7 +243,7 @@ public class FileCopier extends SrcToDestCopier{ * 1、如果目标是一个不存在的路径,则目标以文件对待(自动创建父级目录)比如:/dest/aaa,如果aaa不存在,则aaa被当作文件名 * 2、如果目标是一个已存在的目录,则文件拷贝到此目录下,文件名与原文件名一致 * - * + * * @param src 源文件,必须为文件 * @param dest 目标文件,如果非覆盖模式必须为目录 * @throws IORuntimeException IO异常 @@ -253,14 +253,14 @@ public class FileCopier extends SrcToDestCopier{ //被过滤的文件跳过 return; } - + // 如果已经存在目标文件,切为不覆盖模式,跳过之 if (dest.exists()) { if(dest.isDirectory()) { //目标为目录,目录下创建同名文件 dest = new File(dest, src.getName()); } - + if(dest.exists() && false == isOverride) { //非覆盖模式跳过 return; @@ -270,7 +270,7 @@ public class FileCopier extends SrcToDestCopier{ //noinspection ResultOfMethodCallIgnored dest.getParentFile().mkdirs(); } - + final ArrayList optionList = new ArrayList<>(2); if(isOverride) { optionList.add(StandardCopyOption.REPLACE_EXISTING); @@ -278,7 +278,7 @@ public class FileCopier extends SrcToDestCopier{ if(isCopyAttributes) { optionList.add(StandardCopyOption.COPY_ATTRIBUTES); } - + try { Files.copy(src.toPath(), dest.toPath(), optionList.toArray(new CopyOption[0])); } catch (IOException e) { diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileMode.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileMode.java index 3b1958c29..a58020b92 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileMode.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileMode.java @@ -2,7 +2,7 @@ package cn.hutool.core.io.file; /** * 文件读写模式,常用于RandomAccessFile - * + * * @author looly * @since 4.5.2 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileReader.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileReader.java index a29fd6419..355b45a7c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileReader.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileReader.java @@ -20,13 +20,13 @@ import java.util.List; /** * 文件读取器 - * + * * @author Looly * */ public class FileReader extends FileWrapper { private static final long serialVersionUID = 1L; - + /** * 创建 FileReader * @param file 文件 @@ -36,7 +36,7 @@ public class FileReader extends FileWrapper { public static FileReader create(File file, Charset charset){ return new FileReader(file, charset); } - + /** * 创建 FileReader, 编码:{@link FileWrapper#DEFAULT_CHARSET} * @param file 文件 @@ -45,7 +45,7 @@ public class FileReader extends FileWrapper { public static FileReader create(File file){ return new FileReader(file); } - + // ------------------------------------------------------- Constructor start /** * 构造 @@ -106,7 +106,7 @@ public class FileReader extends FileWrapper { /** * 读取文件所有数据
* 文件的长度不能超过 {@link Integer#MAX_VALUE} - * + * * @return 字节码 * @throws IORuntimeException IO异常 */ @@ -136,7 +136,7 @@ public class FileReader extends FileWrapper { /** * 读取文件内容 - * + * * @return 内容 * @throws IORuntimeException IO异常 */ @@ -146,7 +146,7 @@ public class FileReader extends FileWrapper { /** * 从文件中读取每一行数据 - * + * * @param 集合类型 * @param collection 集合 * @return 文件中的每行内容的集合 @@ -171,10 +171,10 @@ public class FileReader extends FileWrapper { IoUtil.close(reader); } } - + /** * 按照行处理文件内容 - * + * * @param lineHandler 行处理器 * @throws IORuntimeException IO异常 * @since 3.0.9 @@ -188,10 +188,10 @@ public class FileReader extends FileWrapper { IoUtil.close(reader); } } - + /** * 从文件中读取每一行数据 - * + * * @return 文件中的每行内容的集合 * @throws IORuntimeException IO异常 */ @@ -201,7 +201,7 @@ public class FileReader extends FileWrapper { /** * 按照给定的readerHandler读取文件中的数据 - * + * * @param 读取的结果对象类型 * @param readerHandler Reader处理类 * @return 从文件中read出的数据 @@ -223,7 +223,7 @@ public class FileReader extends FileWrapper { /** * 获得一个文件读取器 - * + * * @return BufferedReader对象 * @throws IORuntimeException IO异常 */ @@ -233,7 +233,7 @@ public class FileReader extends FileWrapper { /** * 获得输入流 - * + * * @return 输入流 * @throws IORuntimeException IO异常 */ @@ -255,10 +255,10 @@ public class FileReader extends FileWrapper { public long writeToStream(OutputStream out) throws IORuntimeException { return writeToStream(out, false); } - + /** * 将文件写入流中 - * + * * @param out 流 * @param isCloseOut 是否关闭输出流 * @return 写出的流byte数 @@ -280,7 +280,7 @@ public class FileReader extends FileWrapper { // -------------------------------------------------------------------------- Interface start /** * Reader处理接口 - * + * * @author Luxiaolei * * @param Reader处理返回结果类型 @@ -289,10 +289,10 @@ public class FileReader extends FileWrapper { T handle(BufferedReader reader) throws IOException; } // -------------------------------------------------------------------------- Interface end - + /** * 检查文件 - * + * * @throws IORuntimeException IO异常 */ private void checkFile() throws IORuntimeException { diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java index 8620d2e89..cb5fb628b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java @@ -10,16 +10,16 @@ import cn.hutool.core.util.CharsetUtil; /** * 文件包装器,扩展文件对象 - * + * * @author Looly * */ public class FileWrapper implements Serializable{ private static final long serialVersionUID = 1L; - + protected File file; protected Charset charset; - + /** 默认编码:UTF-8 */ public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java index ff7230867..66edf01bc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java @@ -27,7 +27,7 @@ import java.util.Map.Entry; */ public class FileWriter extends FileWrapper{ private static final long serialVersionUID = 1L; - + /** * 创建 FileWriter * @param file 文件 @@ -37,7 +37,7 @@ public class FileWriter extends FileWrapper{ public static FileWriter create(File file, Charset charset){ return new FileWriter(file, charset); } - + /** * 创建 FileWriter, 编码:{@link FileWrapper#DEFAULT_CHARSET} * @param file 文件 @@ -46,7 +46,7 @@ public class FileWriter extends FileWrapper{ public static FileWriter create(File file){ return new FileWriter(file); } - + // ------------------------------------------------------- Constructor start /** * 构造 @@ -103,10 +103,10 @@ public class FileWriter extends FileWrapper{ this(filePath, DEFAULT_CHARSET); } // ------------------------------------------------------- Constructor end - + /** * 将String写入文件 - * + * * @param content 写入的内容 * @param isAppend 是否追加 * @return 目标文件 @@ -125,10 +125,10 @@ public class FileWriter extends FileWrapper{ } return file; } - + /** * 将String写入文件,覆盖模式 - * + * * @param content 写入的内容 * @return 目标文件 * @throws IORuntimeException IO异常 @@ -139,7 +139,7 @@ public class FileWriter extends FileWrapper{ /** * 将String写入文件,追加模式 - * + * * @param content 写入的内容 * @return 写入的文件 * @throws IORuntimeException IO异常 @@ -150,7 +150,7 @@ public class FileWriter extends FileWrapper{ /** * 将列表写入文件,覆盖模式 - * + * * @param 集合元素类型 * @param list 列表 * @return 目标文件 @@ -162,7 +162,7 @@ public class FileWriter extends FileWrapper{ /** * 将列表写入文件,追加模式 - * + * * @param 集合元素类型 * @param list 列表 * @return 目标文件 @@ -174,7 +174,7 @@ public class FileWriter extends FileWrapper{ /** * 将列表写入文件 - * + * * @param 集合元素类型 * @param list 列表 * @param isAppend 是否追加 @@ -184,10 +184,10 @@ public class FileWriter extends FileWrapper{ public File writeLines(Collection list, boolean isAppend) throws IORuntimeException { return writeLines(list, null, isAppend); } - + /** * 将列表写入文件 - * + * * @param 集合元素类型 * @param list 列表 * @param lineSeparator 换行符枚举(Windows、Mac或Linux换行符) @@ -208,10 +208,10 @@ public class FileWriter extends FileWrapper{ } return this.file; } - + /** * 将Map写入文件,每个键值对为一行,一行中键与值之间使用kvSeparator分隔 - * + * * @param map Map * @param kvSeparator 键和值之间的分隔符,如果传入null使用默认分隔符" = " * @param isAppend 是否追加 @@ -222,10 +222,10 @@ public class FileWriter extends FileWrapper{ public File writeMap(Map map, String kvSeparator, boolean isAppend) throws IORuntimeException { return writeMap(map, null, kvSeparator, isAppend); } - + /** * 将Map写入文件,每个键值对为一行,一行中键与值之间使用kvSeparator分隔 - * + * * @param map Map * @param lineSeparator 换行符枚举(Windows、Mac或Linux换行符) * @param kvSeparator 键和值之间的分隔符,如果传入null使用默认分隔符" = " @@ -249,10 +249,10 @@ public class FileWriter extends FileWrapper{ } return this.file; } - + /** * 写入数据到文件 - * + * * @param data 数据 * @param off 数据开始位置 * @param len 数据长度 @@ -262,10 +262,10 @@ public class FileWriter extends FileWrapper{ public File write(byte[] data, int off, int len) throws IORuntimeException { return write(data, off, len, false); } - + /** * 追加数据到文件 - * + * * @param data 数据 * @param off 数据开始位置 * @param len 数据长度 @@ -278,7 +278,7 @@ public class FileWriter extends FileWrapper{ /** * 写入数据到文件 - * + * * @param data 数据 * @param off 数据开始位置 * @param len 数据长度 @@ -314,7 +314,7 @@ public class FileWriter extends FileWrapper{ /** * 将流的内容写入文件 - * + * * @param in 输入流,不关闭 * @param isCloseIn 是否关闭输入流 * @return dest @@ -339,7 +339,7 @@ public class FileWriter extends FileWrapper{ /** * 获得一个输出流对象 - * + * * @return 输出流对象 * @throws IORuntimeException IO异常 */ @@ -353,7 +353,7 @@ public class FileWriter extends FileWrapper{ /** * 获得一个带缓存的写入对象 - * + * * @param isAppend 是否追加 * @return BufferedReader对象 * @throws IORuntimeException IO异常 @@ -368,7 +368,7 @@ public class FileWriter extends FileWrapper{ /** * 获得一个打印写入对象,可以有print - * + * * @param isAppend 是否追加 * @return 打印对象 * @throws IORuntimeException IO异常 @@ -376,10 +376,10 @@ public class FileWriter extends FileWrapper{ public PrintWriter getPrintWriter(boolean isAppend) throws IORuntimeException { return new PrintWriter(getWriter(isAppend)); } - + /** * 检查文件 - * + * * @throws IORuntimeException IO异常 */ private void checkFile() throws IORuntimeException { @@ -388,7 +388,7 @@ public class FileWriter extends FileWrapper{ throw new IORuntimeException("File [{}] is not a file !", this.file.getAbsoluteFile()); } } - + /** * 打印新行 * @param writer Writer diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java b/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java index 7f0238302..7178e665f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java @@ -13,7 +13,7 @@ import java.nio.file.WatchEvent; /** * 行处理的Watcher实现 - * + * * @author looly * @since 4.5.2 */ @@ -25,7 +25,7 @@ public class LineReadWatcher extends SimpleWatcher implements Runnable { /** * 构造 - * + * * @param randomAccessFile {@link RandomAccessFile} * @param charset 编码 * @param lineHandler 行处理器{@link LineHandler}实现 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java b/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java index 0512ee647..9bb72afed 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java @@ -8,7 +8,7 @@ package cn.hutool.core.io.file; * Linux系统换行符:"\n" * Windows系统换行符:"\r\n" * - * + * * @see #MAC * @see #LINUX * @see #WINDOWS @@ -19,7 +19,7 @@ public enum LineSeparator { /** Mac系统换行符:"\r" */ MAC("\r"), /** Linux系统换行符:"\n" */ - LINUX("\n"), + LINUX("\n"), /** Windows系统换行符:"\r\n" */ WINDOWS("\r\n"); diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/file/package-info.java index 297a34739..53c289fe4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/package-info.java @@ -1,6 +1,6 @@ /** * 对文件读写的封装,包括文件拷贝、文件读取、文件写出、行处理等 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/visitor/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/file/visitor/package-info.java index 5f2c17144..d58d04979 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/visitor/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/visitor/package-info.java @@ -1,6 +1,6 @@ /** * FileVisitor功能性实现,包括递归删除、拷贝等 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/package-info.java index 758e57b00..13ff868d5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/package-info.java @@ -1,6 +1,6 @@ /** * IO相关封装和工具类,包括Inputstream和OutputStream实现类,工具包括流工具IoUtil、文件工具FileUtil和Buffer工具BufferUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/BytesResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/BytesResource.java index 664cf12fe..91c1041a3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/BytesResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/BytesResource.java @@ -12,7 +12,7 @@ import java.nio.charset.Charset; /** * 基于byte[]的资源获取器
* 注意:此对象中getUrl方法始终返回null - * + * * @author looly * @since 4.0.9 */ @@ -24,16 +24,16 @@ public class BytesResource implements Resource, Serializable { /** * 构造 - * + * * @param bytes 字节数组 */ public BytesResource(byte[] bytes) { this(bytes, null); } - + /** * 构造 - * + * * @param bytes 字节数组 * @param name 资源名称 */ @@ -41,7 +41,7 @@ public class BytesResource implements Resource, Serializable { this.bytes = bytes; this.name = name; } - + @Override public String getName() { return this.name; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/CharSequenceResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/CharSequenceResource.java index 75de851b3..cf0d851d5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/CharSequenceResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/CharSequenceResource.java @@ -14,7 +14,7 @@ import java.nio.charset.Charset; /** * {@link CharSequence}资源,字符串做为资源 - * + * * @author looly * @since 5.5.2 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/ClassPathResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/ClassPathResource.java index 08b479d0d..d1de60a40 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/ClassPathResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/ClassPathResource.java @@ -13,7 +13,7 @@ import cn.hutool.core.util.URLUtil; * ClassPath单一资源访问类
* 传入路径path必须为相对路径,如果传入绝对路径,Linux路径会去掉开头的“/”,而Windows路径会直接报错。
* 传入的path所指向的资源必须存在,否则报错 - * + * * @author Looly * */ @@ -27,7 +27,7 @@ public class ClassPathResource extends UrlResource { // -------------------------------------------------------------------------------------- Constructor start /** * 构造 - * + * * @param path 相对于ClassPath的路径 */ public ClassPathResource(String path) { @@ -36,7 +36,7 @@ public class ClassPathResource extends UrlResource { /** * 构造 - * + * * @param path 相对于ClassPath的路径 * @param classLoader {@link ClassLoader} */ @@ -46,7 +46,7 @@ public class ClassPathResource extends UrlResource { /** * 构造 - * + * * @param path 相对于给定Class的路径 * @param clazz {@link Class} 用于定位路径 */ @@ -56,7 +56,7 @@ public class ClassPathResource extends UrlResource { /** * 构造 - * + * * @param pathBaseClassLoader 相对路径 * @param classLoader {@link ClassLoader} * @param clazz {@link Class} 用于定位路径 @@ -64,11 +64,11 @@ public class ClassPathResource extends UrlResource { public ClassPathResource(String pathBaseClassLoader, ClassLoader classLoader, Class clazz) { super((URL) null); Assert.notNull(pathBaseClassLoader, "Path must not be null"); - + final String path = normalizePath(pathBaseClassLoader); this.path = path; this.name = StrUtil.isBlank(path) ? null : FileUtil.getName(path); - + this.classLoader = ObjectUtil.defaultIfNull(classLoader, ClassUtil.getClassLoader()); this.clazz = clazz; initUrl(); @@ -77,7 +77,7 @@ public class ClassPathResource extends UrlResource { /** * 获得Path - * + * * @return path */ public final String getPath() { @@ -87,7 +87,7 @@ public class ClassPathResource extends UrlResource { /** * 获得绝对路径Path
* 对于不存在的资源,返回拼接后的绝对路径 - * + * * @return 绝对路径path */ public final String getAbsolutePath() { @@ -100,7 +100,7 @@ public class ClassPathResource extends UrlResource { /** * 获得 {@link ClassLoader} - * + * * @return {@link ClassLoader} */ public final ClassLoader getClassLoader() { @@ -130,7 +130,7 @@ public class ClassPathResource extends UrlResource { /** * 标准化Path格式 - * + * * @param path Path * @return 标准化后的path */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/FileResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/FileResource.java index a4efb96a0..3c44d8d50 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/FileResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/FileResource.java @@ -11,7 +11,7 @@ import java.nio.file.Path; /** * 文件资源访问对象,支持{@link Path} 和 {@link File} 访问 - * + * * @author looly */ public class FileResource implements Resource, Serializable { @@ -22,7 +22,7 @@ public class FileResource implements Resource, Serializable { // ----------------------------------------------------------------------- Constructor start /** * 构造 - * + * * @param path 文件 * @since 4.4.1 */ @@ -32,7 +32,7 @@ public class FileResource implements Resource, Serializable { /** * 构造 - * + * * @param file 文件 */ public FileResource(File file) { @@ -41,7 +41,7 @@ public class FileResource implements Resource, Serializable { /** * 构造 - * + * * @param file 文件 * @param fileName 文件名,如果为null获取文件本身的文件名 */ @@ -51,7 +51,7 @@ public class FileResource implements Resource, Serializable { /** * 构造 - * + * * @param path 文件绝对路径或相对ClassPath路径,但是这个路径不能指向一个jar包中的文件 */ public FileResource(String path) { diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java index 686caf205..887bc763d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java @@ -7,7 +7,7 @@ import java.net.URL; /** * 基于{@link InputStream}的资源获取器
* 注意:此对象中getUrl方法始终返回null - * + * * @author looly * @since 4.0.9 */ @@ -19,16 +19,16 @@ public class InputStreamResource implements Resource, Serializable { /** * 构造 - * + * * @param in {@link InputStream} */ public InputStreamResource(InputStream in) { this(in, null); } - + /** * 构造 - * + * * @param in {@link InputStream} * @param name 资源名称 */ @@ -36,7 +36,7 @@ public class InputStreamResource implements Resource, Serializable { this.in = in; this.name = name; } - + @Override public String getName() { return this.name; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiFileResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiFileResource.java index 457de62e7..4abe22c90 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiFileResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiFileResource.java @@ -6,34 +6,34 @@ import java.util.Collection; /** * 多文件组合资源
* 此资源为一个利用游标自循环资源,只有调用{@link #next()} 方法才会获取下一个资源,使用完毕后调用{@link #reset()}方法重置游标 - * + * * @author looly * */ public class MultiFileResource extends MultiResource{ private static final long serialVersionUID = 1L; - + /** * 构造 - * + * * @param files 文件资源列表 */ public MultiFileResource(Collection files) { add(files); } - + /** * 构造 - * + * * @param files 文件资源列表 */ public MultiFileResource(File... files) { add(files); } - + /** * 增加文件资源 - * + * * @param files 文件资源 * @return this */ @@ -43,10 +43,10 @@ public class MultiFileResource extends MultiResource{ } return this; } - + /** * 增加文件资源 - * + * * @param files 文件资源 * @return this */ @@ -56,7 +56,7 @@ public class MultiFileResource extends MultiResource{ } return this; } - + @Override public MultiFileResource add(Resource resource) { return (MultiFileResource)super.add(resource); diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java index 22cc38e9c..8464aa808 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java @@ -16,7 +16,7 @@ import java.util.List; /** * 多资源组合资源
* 此资源为一个利用游标自循环资源,只有调用{@link #next()} 方法才会获取下一个资源,使用完毕后调用{@link #reset()}方法重置游标 - * + * * @author looly * @since 4.1.0 */ @@ -25,10 +25,10 @@ public class MultiResource implements Resource, Iterable, Iterator resources; private int cursor; - + /** * 构造 - * + * * @param resources 资源数组 */ public MultiResource(Resource... resources) { @@ -37,7 +37,7 @@ public class MultiResource implements Resource, Iterable, Iterator resources) { @@ -113,7 +113,7 @@ public class MultiResource implements Resource, Iterable, Iterator * 路径用/分隔,例如: - * + * *
 	 * config/a/db.config
 	 * spring/xml/test.xml
 	 * 
- * + * * @param resource 资源(相对Classpath的路径) * @return 资源URL */ @@ -129,12 +129,12 @@ public class ResourceUtil { /** * 获取指定路径下的资源列表
* 路径格式必须为目录格式,用/分隔,例如: - * + * *
 	 * config/a
 	 * spring/xml
 	 * 
- * + * * @param resource 资源路径 * @return 资源列表 */ @@ -151,12 +151,12 @@ public class ResourceUtil { /** * 获取指定路径下的资源Iterator
* 路径格式必须为目录格式,用/分隔,例如: - * + * *
 	 * config/a
 	 * spring/xml
 	 * 
- * + * * @param resource 资源路径 * @return 资源列表 * @since 4.1.5 @@ -173,7 +173,7 @@ public class ResourceUtil { /** * 获得资源相对路径对应的URL - * + * * @param resource 资源相对路径 * @param baseClass 基准Class,获得的相对路径相对于此Class所在路径,如果为{@code null}则相对ClassPath * @return {@link URL} @@ -185,7 +185,7 @@ public class ResourceUtil { /** * 获取{@link Resource} 资源对象
* 如果提供路径为绝对路径或路径以file:开头,返回{@link FileResource},否则返回{@link ClassPathResource} - * + * * @param path 路径,可以是绝对路径,也可以是相对路径(相对ClassPath) * @return {@link Resource} 资源对象 * @since 3.2.1 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java index 5b4e954a6..540056fa4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java @@ -6,7 +6,7 @@ import java.nio.charset.Charset; /** * 字符串资源,字符串做为资源 - * + * * @author looly * @since 4.1.0 * @see CharSequenceResource diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java index 6c5f69be9..0a7800611 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java @@ -16,10 +16,10 @@ import java.net.URL; */ public class UrlResource implements Resource, Serializable{ private static final long serialVersionUID = 1L; - + protected URL url; protected String name; - + //-------------------------------------------------------------------------------------- Constructor start /** * 构造 @@ -28,7 +28,7 @@ public class UrlResource implements Resource, Serializable{ public UrlResource(URL url) { this(url, null); } - + /** * 构造 * @param url URL,允许为空 @@ -38,7 +38,7 @@ public class UrlResource implements Resource, Serializable{ this.url = url; this.name = ObjectUtil.defaultIfNull(name, (null != url) ? FileUtil.getName(url.getPath()) : null); } - + /** * 构造 * @param file 文件路径 @@ -49,17 +49,17 @@ public class UrlResource implements Resource, Serializable{ this.url = URLUtil.getURL(file); } //-------------------------------------------------------------------------------------- Constructor end - + @Override public String getName() { return this.name; } - + @Override public URL getUrl(){ return this.url; } - + @Override public InputStream getStream() throws NoResourceException{ if(null == this.url){ @@ -67,7 +67,7 @@ public class UrlResource implements Resource, Serializable{ } return URLUtil.getStream(url); } - + /** * 获得File * @return {@link File} @@ -75,7 +75,7 @@ public class UrlResource implements Resource, Serializable{ public File getFile(){ return FileUtil.file(this.url); } - + /** * 返回路径 * @return 返回URL路径 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/WebAppResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/WebAppResource.java index 927ec5407..eacae8a62 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/WebAppResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/WebAppResource.java @@ -6,7 +6,7 @@ import cn.hutool.core.io.FileUtil; /** * Web root资源访问对象 - * + * * @author looly * @since 4.1.11 */ @@ -15,7 +15,7 @@ public class WebAppResource extends FileResource { /** * 构造 - * + * * @param path 相对于Web root的路径 */ public WebAppResource(String path) { diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/package-info.java index 4f50b3a7a..cd01639d6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/package-info.java @@ -1,6 +1,6 @@ /** * 针对ClassPath和文件中资源读取的封装,主要入口为工具类ResourceUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/unit/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/unit/package-info.java index 7a9f0768e..c5f6693f8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/unit/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/unit/package-info.java @@ -1,6 +1,6 @@ /** * 数据单位相关封装,包括DataUnit数据单位和DataSize数据大小 - * + * * @author looly * @since 5.3.10 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/SimpleWatcher.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/SimpleWatcher.java index 61eae3bc2..3a1b614e6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/SimpleWatcher.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/SimpleWatcher.java @@ -9,5 +9,5 @@ import cn.hutool.core.io.watch.watchers.IgnoreWatcher; * */ public class SimpleWatcher extends IgnoreWatcher{ - + } diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java index c93fc22ef..bddcf8b0a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java @@ -12,14 +12,14 @@ import cn.hutool.core.util.URLUtil; /** * 监听工具类
* 主要负责文件监听器的快捷创建 - * + * * @author Looly * @since 3.1.0 */ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param url URL * @param events 监听的事件列表 * @return 监听对象 @@ -30,7 +30,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param url URL * @param events 监听的事件列表 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 @@ -42,7 +42,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param uri URI * @param events 监听的事件列表 * @return 监听对象 @@ -53,7 +53,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param uri URI * @param events 监听的事件列表 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 @@ -65,7 +65,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param file 文件 * @param events 监听的事件列表 * @return 监听对象 @@ -76,7 +76,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param file 文件 * @param events 监听的事件列表 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 @@ -88,7 +88,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param path 路径 * @param events 监听的事件列表 * @return 监听对象 @@ -99,7 +99,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param path 路径 * @param events 监听的事件列表 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 @@ -111,7 +111,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param path 路径 * @param events 监听事件列表 * @return 监听对象 @@ -122,7 +122,7 @@ public class WatchUtil { /** * 创建并初始化监听 - * + * * @param path 路径 * @param events 监听事件列表 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 @@ -135,7 +135,7 @@ public class WatchUtil { // ---------------------------------------------------------------------------------------------------------- createAll /** * 创建并初始化监听,监听所有事件 - * + * * @param url URL * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -143,10 +143,10 @@ public class WatchUtil { public static WatchMonitor createAll(URL url, Watcher watcher) { return createAll(url, 0, watcher); } - + /** * 创建并初始化监听,监听所有事件 - * + * * @param url URL * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -155,10 +155,10 @@ public class WatchUtil { public static WatchMonitor createAll(URL url, int maxDepth, Watcher watcher) { return createAll(URLUtil.toURI(url), maxDepth, watcher); } - + /** * 创建并初始化监听,监听所有事件 - * + * * @param uri URI * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -166,10 +166,10 @@ public class WatchUtil { public static WatchMonitor createAll(URI uri, Watcher watcher) { return createAll(uri, 0, watcher); } - + /** * 创建并初始化监听,监听所有事件 - * + * * @param uri URI * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -181,7 +181,7 @@ public class WatchUtil { /** * 创建并初始化监听,监听所有事件 - * + * * @param file 被监听文件 * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -189,10 +189,10 @@ public class WatchUtil { public static WatchMonitor createAll(File file, Watcher watcher) { return createAll(file, 0, watcher); } - + /** * 创建并初始化监听,监听所有事件 - * + * * @param file 被监听文件 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -204,7 +204,7 @@ public class WatchUtil { /** * 创建并初始化监听,监听所有事件 - * + * * @param path 路径 * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -212,10 +212,10 @@ public class WatchUtil { public static WatchMonitor createAll(String path, Watcher watcher) { return createAll(path, 0, watcher); } - + /** * 创建并初始化监听,监听所有事件 - * + * * @param path 路径 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -227,7 +227,7 @@ public class WatchUtil { /** * 创建并初始化监听,监听所有事件 - * + * * @param path 路径 * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -235,10 +235,10 @@ public class WatchUtil { public static WatchMonitor createAll(Path path, Watcher watcher) { return createAll(path, 0, watcher); } - + /** * 创建并初始化监听,监听所有事件 - * + * * @param path 路径 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -249,11 +249,11 @@ public class WatchUtil { watchMonitor.setWatcher(watcher); return watchMonitor; } - + // ---------------------------------------------------------------------------------------------------------- createModify /** * 创建并初始化监听,监听修改事件 - * + * * @param url URL * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -262,10 +262,10 @@ public class WatchUtil { public static WatchMonitor createModify(URL url, Watcher watcher) { return createModify(url, 0, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param url URL * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -275,10 +275,10 @@ public class WatchUtil { public static WatchMonitor createModify(URL url, int maxDepth, Watcher watcher) { return createModify(URLUtil.toURI(url), maxDepth, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param uri URI * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -287,10 +287,10 @@ public class WatchUtil { public static WatchMonitor createModify(URI uri, Watcher watcher) { return createModify(uri, 0, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param uri URI * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -300,10 +300,10 @@ public class WatchUtil { public static WatchMonitor createModify(URI uri, int maxDepth, Watcher watcher) { return createModify(Paths.get(uri), maxDepth, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param file 被监听文件 * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -312,10 +312,10 @@ public class WatchUtil { public static WatchMonitor createModify(File file, Watcher watcher) { return createModify(file, 0, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param file 被监听文件 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -325,10 +325,10 @@ public class WatchUtil { public static WatchMonitor createModify(File file, int maxDepth, Watcher watcher) { return createModify(file.toPath(), 0, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param path 路径 * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -337,10 +337,10 @@ public class WatchUtil { public static WatchMonitor createModify(String path, Watcher watcher) { return createModify(path, 0, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param path 路径 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} @@ -350,10 +350,10 @@ public class WatchUtil { public static WatchMonitor createModify(String path, int maxDepth, Watcher watcher) { return createModify(Paths.get(path), maxDepth, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param path 路径 * @param watcher {@link Watcher} * @return {@link WatchMonitor} @@ -362,10 +362,10 @@ public class WatchUtil { public static WatchMonitor createModify(Path path, Watcher watcher) { return createModify(path, 0, watcher); } - + /** * 创建并初始化监听,监听修改事件 - * + * * @param path 路径 * @param maxDepth 当监听目录时,监听目录的最大深度,当设置值为1(或小于1)时,表示不递归监听子目录 * @param watcher {@link Watcher} diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/package-info.java index 3c3f57105..f4763224e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/package-info.java @@ -1,6 +1,6 @@ /** * 基于JDK7+ WatchService的文件和目录监听封装,支持多级目录 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/DelayWatcher.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/DelayWatcher.java index 64d3143fc..4d6ee2557 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/DelayWatcher.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/DelayWatcher.java @@ -17,19 +17,19 @@ import java.util.Set; * 在监听目录或文件时,如果这个文件有修改操作,会多次触发modify方法。
* 此类通过维护一个Set将短时间内相同文件多次modify的事件合并处理触发,从而避免以上问题。
* 注意:延迟只针对modify事件,其它事件无效 - * + * * @author Looly * @since 3.1.0 */ public class DelayWatcher implements Watcher { - + /** Path集合。此集合用于去重在指定delay内多次触发的文件Path */ private final Set eventSet = new ConcurrentHashSet<>(); /** 实际处理 */ private final Watcher watcher; /** 延迟,单位毫秒 */ private final long delay; - + //---------------------------------------------------------------------------------------------------------- Constructor start /** * 构造 @@ -45,7 +45,7 @@ public class DelayWatcher implements Watcher { this.delay = delay; } //---------------------------------------------------------------------------------------------------------- Constructor end - + @Override public void onModify(WatchEvent event, Path currentPath) { if(this.delay < 1) { @@ -54,22 +54,22 @@ public class DelayWatcher implements Watcher { onDelayModify(event, currentPath); } } - + @Override public void onCreate(WatchEvent event, Path currentPath) { watcher.onCreate(event, currentPath); } - + @Override public void onDelete(WatchEvent event, Path currentPath) { watcher.onDelete(event, currentPath); } - + @Override public void onOverflow(WatchEvent event, Path currentPath) { watcher.onOverflow(event, currentPath); } - + //---------------------------------------------------------------------------------------------------------- Private method start /** * 触发延迟修改 @@ -82,15 +82,15 @@ public class DelayWatcher implements Watcher { //此事件已经被触发过,后续事件忽略,等待统一处理。 return; } - + //事件第一次触发,此时标记事件,并启动处理线程延迟处理,处理结束后会删除标记 eventSet.add(eventPath); startHandleModifyThread(event, currentPath); } - + /** * 开启处理线程 - * + * * @param event 事件 * @param currentPath 事件发生的当前Path路径 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/IgnoreWatcher.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/IgnoreWatcher.java index 2bad47d09..3beed7321 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/IgnoreWatcher.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/IgnoreWatcher.java @@ -8,7 +8,7 @@ import cn.hutool.core.io.watch.Watcher; /** * 跳过所有事件处理Watcher
* 用户继承此类后实现需要监听的方法 - * + * * @author Looly * @since 3.1.0 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java index 128574a87..18ba2bea7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java @@ -12,7 +12,7 @@ import java.util.List; /** * 观察者链
* 用于加入多个观察者 - * + * * @author Looly * @since 3.1.0 */ @@ -20,7 +20,7 @@ public class WatcherChain implements Watcher, Chain{ /** 观察者列表 */ final private List chain; - + /** * 创建观察者链{@link WatcherChain} * @param watchers 观察者列表 @@ -29,7 +29,7 @@ public class WatcherChain implements Watcher, Chain{ public static WatcherChain create(Watcher... watchers) { return new WatcherChain(watchers); } - + /** * 构造 * @param watchers 观察者列表 @@ -37,7 +37,7 @@ public class WatcherChain implements Watcher, Chain{ public WatcherChain(Watcher... watchers) { chain = CollUtil.newArrayList(watchers); } - + @Override public void onCreate(WatchEvent event, Path currentPath) { for (Watcher watcher : chain) { diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/package-info.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/package-info.java index 1562c9aed..db4a52482 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/package-info.java @@ -1,6 +1,6 @@ /** * 文件监听中的观察者实现类,包括延迟处理、处理链等 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ConsistentHash.java b/hutool-core/src/main/java/cn/hutool/core/lang/ConsistentHash.java index 84be21410..d8e50fb65 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/ConsistentHash.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ConsistentHash.java @@ -18,14 +18,14 @@ import java.util.TreeMap; */ public class ConsistentHash implements Serializable{ private static final long serialVersionUID = 1L; - + /** Hash计算对象,用于自定义hash算法 */ Hash32 hashFunc; /** 复制的节点个数 */ private final int numberOfReplicas; /** 一致性Hash环 */ private final SortedMap circle = new TreeMap<>(); - + /** * 构造,使用Java默认的Hash算法 * @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Holder.java b/hutool-core/src/main/java/cn/hutool/core/lang/Holder.java index 481882858..446bb69cc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Holder.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Holder.java @@ -13,7 +13,7 @@ public final class Holder extends MutableObj{ /** * 新建Holder类,持有指定值,当值为空时抛出空指针异常 - * + * * @param 被持有的对象类型 * @param value 值,不能为空 * @return Holder @@ -24,14 +24,14 @@ public final class Holder extends MutableObj{ } return new Holder<>(value); } - + //--------------------------------------------------------------------------- Constructor start /** * 构造 */ public Holder() { } - + /** * 构造 * @param value 被包装的对象 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java b/hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java index 45957ab09..8b4740296 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java @@ -14,16 +14,16 @@ import cn.hutool.core.util.StrUtil; /** * MongoDB ID生成策略实现
* ObjectId由以下几部分组成: - * + * *
  * 1. Time 时间戳。
  * 2. Machine 所在主机的唯一标识符,一般是机器主机名的散列值。
  * 3. PID 进程ID。确保同一机器中不冲突
  * 4. INC 自增计数器。确保同一秒内产生objectId的唯一性。
  * 
- * + * * 参考:http://blog.csdn.net/qxc1281/article/details/54021882 - * + * * @author looly * @since 4.0.0 * @@ -37,7 +37,7 @@ public class ObjectId { /** * 给定的字符串是否为有效的ObjectId - * + * * @param s 字符串 * @return 是否为有效的ObjectId */ @@ -70,7 +70,7 @@ public class ObjectId { /** * 获取一个objectId的bytes表现形式 - * + * * @return objectId * @since 4.1.15 */ @@ -85,7 +85,7 @@ public class ObjectId { /** * 获取一个objectId用下划线分割 - * + * * @return objectId */ public static String next() { @@ -94,7 +94,7 @@ public class ObjectId { /** * 获取一个objectId - * + * * @param withHyphen 是否包含分隔符 * @return objectId */ @@ -119,7 +119,7 @@ public class ObjectId { // ----------------------------------------------------------------------------------------- Private method start /** * 获取机器码片段 - * + * * @return 机器码片段 */ private static int getMachinePiece() { @@ -146,7 +146,7 @@ public class ObjectId { /** * 获取进程码片段 - * + * * @return 进程码片段 */ private static int getProcessPiece() { diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java b/hutool-core/src/main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java index 1075ce5dd..f702ed5b7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java @@ -9,20 +9,20 @@ import cn.hutool.core.util.StrUtil; /** * {@link ParameterizedType} 接口实现,用于重新定义泛型类型 - * + * * @author looly * @since 4.5.7 */ public class ParameterizedTypeImpl implements ParameterizedType, Serializable { private static final long serialVersionUID = 1L; - + private final Type[] actualTypeArguments; private final Type ownerType; private final Type rawType; /** * 构造 - * + * * @param actualTypeArguments 实际的泛型参数类型 * @param ownerType 拥有者类型 * @param rawType 原始类型 @@ -71,7 +71,7 @@ public class ParameterizedTypeImpl implements ParameterizedType, Serializable { /** * 追加 {@code types} 到 @{code buf},使用 {@code sep} 分隔 - * + * * @param buf 目标 * @param sep 分隔符 * @param types 加入的类型 @@ -86,14 +86,14 @@ public class ParameterizedTypeImpl implements ParameterizedType, Serializable { } else { buf.append(sep); } - + String typeStr; if(type instanceof Class) { typeStr = ((Class)type).getName(); }else { typeStr = StrUtil.toString(type); } - + buf.append(typeStr); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Range.java b/hutool-core/src/main/java/cn/hutool/core/lang/Range.java index b70bbfea3..f24e309f4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Range.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Range.java @@ -12,11 +12,11 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 范围生成器。根据给定的初始值、结束值和步进生成一个步进列表生成器
* 由于用户自行实现{@link Steper}来定义步进,因此Range本身无法判定边界(是否达到end),需在step实现边界判定逻辑。 - * + * *

* 此类使用{@link ReentrantReadWriteLock}保证线程安全 *

- * + * * @author Looly * * @param 生成范围对象的类型 @@ -45,7 +45,7 @@ public class Range implements Iterable, Iterator, Serializable { /** * 构造 - * + * * @param start 起始对象 * @param steper 步进 */ @@ -55,7 +55,7 @@ public class Range implements Iterable, Iterator, Serializable { /** * 构造 - * + * * @param start 起始对象(包含) * @param end 结束对象(包含) * @param steper 步进 @@ -66,7 +66,7 @@ public class Range implements Iterable, Iterator, Serializable { /** * 构造 - * + * * @param start 起始对象 * @param end 结束对象 * @param steper 步进 @@ -86,7 +86,7 @@ public class Range implements Iterable, Iterator, Serializable { /** * 禁用锁,调用此方法后不在 使用锁保护 - * + * * @return this * @since 4.3.1 */ @@ -143,7 +143,7 @@ public class Range implements Iterable, Iterator, Serializable { /** * 不抛异常的获取下一步进的元素,如果获取失败返回{@code null} - * + * * @param base 上一个元素 * @return 下一步进 */ @@ -169,7 +169,7 @@ public class Range implements Iterable, Iterator, Serializable { /** * 重置{@link Range} - * + * * @return this */ public Range reset() { @@ -186,13 +186,13 @@ public class Range implements Iterable, Iterator, Serializable { /** * 步进接口,此接口用于实现如何对一个对象按照指定步进增加步进
* 步进接口可以定义以下逻辑: - * + * *
 	 * 1、步进规则,即对象如何做步进
 	 * 2、步进大小,通过实现此接口,在实现类中定义一个对象属性,可灵活定义步进大小
 	 * 3、限制range个数,通过实现此接口,在实现类中定义一个对象属性,可灵活定义limit,限制range个数
 	 * 
- * + * * @author Looly * * @param 需要增加步进的对象 @@ -202,7 +202,7 @@ public class Range implements Iterable, Iterator, Serializable { * 增加步进
* 增加步进后的返回值如果为{@code null}则表示步进结束
* 用户需根据end参数自行定义边界,当达到边界时返回null表示结束,否则Range中边界对象无效,会导致无限循环 - * + * * @param current 上一次增加步进后的基础对象 * @param end 结束对象 * @param index 当前索引(步进到第几个元素),从0开始计数 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java b/hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java index 8e29bc4cb..03af67f39 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java @@ -3,7 +3,7 @@ package cn.hutool.core.lang; /** * 替换器
* 通过实现此接口完成指定类型对象的替换操作,替换后的目标类型依旧为指定类型 - * + * * @author looly * * @param 被替换操作的类型 @@ -11,10 +11,10 @@ package cn.hutool.core.lang; */ @FunctionalInterface public interface Replacer { - + /** * 替换指定类型为目标类型 - * + * * @param t 被替换的对象 * @return 替代后的对象 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/TypeReference.java b/hutool-core/src/main/java/cn/hutool/core/lang/TypeReference.java index df3910b2a..ccb9f18b1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/TypeReference.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/TypeReference.java @@ -7,17 +7,17 @@ import cn.hutool.core.util.TypeUtil; /** * Type类型参考
* 通过构建一个类型参考子类,可以获取其泛型参数中的Type类型。例如: - * + * *
  * TypeReference<List<String>> list = new TypeReference<List<String>>() {};
  * Type t = tr.getType();
  * 
- * + * * 此类无法应用于通配符泛型参数(wildcard parameters),比如:{@code Class} 或者 {@code List? extends CharSequence>} - * + * *

* 此类参考FastJSON的TypeReference实现 - * + * * @author looly * * @param 需要自定义的参考类型 @@ -37,13 +37,13 @@ public abstract class TypeReference implements Type { /** * 获取用户定义的泛型参数 - * + * * @return 泛型参数 */ public Type getType() { return this.type; } - + @Override public String toString() { return this.type.toString(); diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java b/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java index 9d4f86601..e6b7b3305 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java @@ -19,11 +19,11 @@ import java.util.TreeMap; *

* 总体思路:累加每个元素的权重A(1)-B(3)-C(6)-D(10),则4个元素的的权重管辖区间分别为[0,1)、[1,3)、[3,6)、[6,10)。
* 然后随机出一个[0,10)之间的随机数。落在哪个区间,则该区间之后的元素即为按权重命中的元素。
- * + * *

* 参考博客:https://www.cnblogs.com/waterystone/p/5708063.html *

- * + * * @param 权重随机获取的对象类型 * @author looly * @since 3.3.0 @@ -55,7 +55,7 @@ public class WeightRandom implements Serializable { /** * 构造 - * + * * @param weightObj 带有权重的对象 */ public WeightRandom(WeightObj weightObj) { @@ -67,7 +67,7 @@ public class WeightRandom implements Serializable { /** * 构造 - * + * * @param weightObjs 带有权重的对象 */ public WeightRandom(Iterable> weightObjs) { @@ -81,7 +81,7 @@ public class WeightRandom implements Serializable { /** * 构造 - * + * * @param weightObjs 带有权重的对象 */ public WeightRandom(WeightObj[] weightObjs) { @@ -94,7 +94,7 @@ public class WeightRandom implements Serializable { /** * 增加对象 - * + * * @param obj 对象 * @param weight 权重 * @return this @@ -105,7 +105,7 @@ public class WeightRandom implements Serializable { /** * 增加对象权重 - * + * * @param weightObj 权重对象 * @return this */ @@ -122,7 +122,7 @@ public class WeightRandom implements Serializable { /** * 清空权重表 - * + * * @return this */ public WeightRandom clear() { @@ -134,7 +134,7 @@ public class WeightRandom implements Serializable { /** * 下一个随机对象 - * + * * @return 随机对象 */ public T next() { @@ -149,7 +149,7 @@ public class WeightRandom implements Serializable { /** * 带有权重的对象包装 - * + * * @author looly * * @param 对象类型 @@ -162,7 +162,7 @@ public class WeightRandom implements Serializable { /** * 构造 - * + * * @param obj 对象 * @param weight 权重 */ @@ -173,7 +173,7 @@ public class WeightRandom implements Serializable { /** * 获取对象 - * + * * @return 对象 */ public T getObj() { @@ -182,7 +182,7 @@ public class WeightRandom implements Serializable { /** * 设置对象 - * + * * @param obj 对象 */ public void setObj(T obj) { @@ -191,7 +191,7 @@ public class WeightRandom implements Serializable { /** * 获取权重 - * + * * @return 权重 */ public double getWeight() { @@ -231,5 +231,5 @@ public class WeightRandom implements Serializable { return Double.doubleToLongBits(weight) == Double.doubleToLongBits(other.weight); } } - + } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/caller/Caller.java b/hutool-core/src/main/java/cn/hutool/core/lang/caller/Caller.java index 49598f588..c372e2c89 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/caller/Caller.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/caller/Caller.java @@ -3,35 +3,35 @@ package cn.hutool.core.lang.caller; /** * 调用者接口
* 可以通过此接口的实现类方法获取调用者、多级调用者以及判断是否被调用 - * + * * @author Looly * */ public interface Caller { /** * 获得调用者 - * + * * @return 调用者 */ Class getCaller(); /** * 获得调用者的调用者 - * + * * @return 调用者的调用者 */ Class getCallerCaller(); /** * 获得调用者,指定第几级调用者 调用者层级关系: - * + * *

 	 * 0 {@link CallerUtil}
 	 * 1 调用{@link CallerUtil}中方法的类
 	 * 2 调用者的调用者
 	 * ...
 	 * 
- * + * * @param depth 层级。0表示{@link CallerUtil}本身,1表示调用{@link CallerUtil}的类,2表示调用者的调用者,依次类推 * @return 第几级调用者 */ @@ -39,7 +39,7 @@ public interface Caller { /** * 是否被指定类调用 - * + * * @param clazz 调用者类 * @return 是否被调用 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java index c80c95cff..cca4fbe4d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java @@ -2,7 +2,7 @@ package cn.hutool.core.lang.caller; /** * 调用者。可以通过此类的方法获取调用者、多级调用者以及判断是否被调用 - * + * * @author Looly * @since 4.1.6 */ @@ -14,7 +14,7 @@ public class CallerUtil { /** * 获得调用者 - * + * * @return 调用者 */ public static Class getCaller() { @@ -23,7 +23,7 @@ public class CallerUtil { /** * 获得调用者的调用者 - * + * * @return 调用者的调用者 */ public static Class getCallerCaller() { @@ -33,14 +33,14 @@ public class CallerUtil { /** * 获得调用者,指定第几级调用者
* 调用者层级关系: - * + * *
 	 * 0 {@link CallerUtil}
 	 * 1 调用{@link CallerUtil}中方法的类
 	 * 2 调用者的调用者
 	 * ...
 	 * 
- * + * * @param depth 层级。0表示{@link CallerUtil}本身,1表示调用{@link CallerUtil}的类,2表示调用者的调用者,依次类推 * @return 第几级调用者 */ @@ -50,7 +50,7 @@ public class CallerUtil { /** * 是否被指定类调用 - * + * * @param clazz 调用者类 * @return 是否被调用 */ @@ -77,7 +77,7 @@ public class CallerUtil { /** * 尝试创建{@link Caller}实现 - * + * * @return {@link Caller}实现 */ private static Caller tryCreateCaller() { @@ -90,7 +90,7 @@ public class CallerUtil { } catch (Throwable e) { //ignore } - + caller = new StackTraceCaller(); return caller; } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/caller/SecurityManagerCaller.java b/hutool-core/src/main/java/cn/hutool/core/lang/caller/SecurityManagerCaller.java index 5f31c14d0..720247580 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/caller/SecurityManagerCaller.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/caller/SecurityManagerCaller.java @@ -6,12 +6,12 @@ import cn.hutool.core.util.ArrayUtil; /** * {@link SecurityManager} 方式获取调用者 - * + * * @author Looly */ public class SecurityManagerCaller extends SecurityManager implements Caller, Serializable { private static final long serialVersionUID = 1L; - + private static final int OFFSET = 1; @Override diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/caller/StackTraceCaller.java b/hutool-core/src/main/java/cn/hutool/core/lang/caller/StackTraceCaller.java index ebad26c87..45a5f843e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/caller/StackTraceCaller.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/caller/StackTraceCaller.java @@ -6,7 +6,7 @@ import cn.hutool.core.exceptions.UtilException; /** * 通过StackTrace方式获取调用者。此方式效率最低,不推荐使用 - * + * * @author Looly */ public class StackTraceCaller implements Caller, Serializable { diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/caller/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/caller/package-info.java index 309254685..5380baf72 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/caller/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/caller/package-info.java @@ -1,6 +1,6 @@ /** * 调用者接口及实现。可以通过此类的方法获取调用者、多级调用者以及判断是否被调用 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java b/hutool-core/src/main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java index e9e6b075a..8efd688f8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java @@ -7,7 +7,7 @@ import cn.hutool.core.lang.Filter; /** * 复制器抽象类
* 抽象复制器抽象了一个对象复制到另一个对象,通过实现{@link #copy()}方法实现复制逻辑。
- * + * * @author Looly * * @param 拷贝的对象 @@ -16,14 +16,14 @@ import cn.hutool.core.lang.Filter; */ public abstract class SrcToDestCopier> implements Copier, Serializable{ private static final long serialVersionUID = 1L; - + /** 源 */ protected T src; /** 目标 */ protected T dest; /** 拷贝过滤器,可以过滤掉不需要拷贝的源 */ protected Filter copyFilter; - + //-------------------------------------------------------------------------------------------------------- Getters and Setters start /** * 获取源 @@ -34,7 +34,7 @@ public abstract class SrcToDestCopier> implem } /** * 设置源 - * + * * @param src 源 * @return this */ @@ -46,7 +46,7 @@ public abstract class SrcToDestCopier> implem /** * 获得目标 - * + * * @return 目标 */ public T getDest() { @@ -54,7 +54,7 @@ public abstract class SrcToDestCopier> implem } /** * 设置目标 - * + * * @param dest 目标 * @return this */ @@ -73,7 +73,7 @@ public abstract class SrcToDestCopier> implem } /** * 设置过滤器 - * + * * @param copyFilter 过滤器 * @return this */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/copier/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/copier/package-info.java index c6c253f58..75f0babd3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/copier/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/copier/package-info.java @@ -1,6 +1,6 @@ /** * 拷贝抽象实现,通过抽象拷贝,可以实现文件、流、Buffer之间的拷贝实现 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/package-info.java index 7df54ee01..84fc234e6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/package-info.java @@ -3,7 +3,7 @@ * 接口灵感来自于ActFramework
* 一个函数接口代表一个一个函数,用于包装一个函数为对象
* 在JDK8之前,Java的函数并不能作为参数传递,也不能作为返回值存在,此接口用于将一个函数包装成为一个对象,从而传递对象 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/generator/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/generator/package-info.java index c04739ffe..76ab4d9d0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/generator/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/generator/package-info.java @@ -1,6 +1,6 @@ /** * 提供生成器接口及相关封装 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/hash/MurmurHash.java b/hutool-core/src/main/java/cn/hutool/core/lang/hash/MurmurHash.java index 1540b7508..b3dd26961 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/hash/MurmurHash.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/hash/MurmurHash.java @@ -9,12 +9,12 @@ import java.nio.charset.Charset; /** * Murmur3 32bit、64bit、128bit 哈希算法实现
* 此算法来自于:https://github.com/xlturing/Simhash4J/blob/master/src/main/java/bee/simhash/main/Murmur3.java - * + * *

* 32-bit Java port of https://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp#94
* 128-bit Java port of https://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp#255 *

- * + * * @author looly,Simhash4J * @since 4.3.3 */ @@ -41,7 +41,7 @@ public class MurmurHash implements Serializable{ private static final int DEFAULT_SEED = 0; private static final Charset DEFAULT_CHARSET = CharsetUtil.CHARSET_UTF_8; - + /** * Murmur3 32-bit Hash值计算 * @@ -118,7 +118,7 @@ public class MurmurHash implements Serializable{ return hash; } - + /** * Murmur3 64-bit Hash值计算 * @@ -132,7 +132,7 @@ public class MurmurHash implements Serializable{ /** * Murmur3 64-bit 算法
* This is essentially MSB 8 bytes of Murmur3 128-bit variant. - * + * * * @param data 数据 * @return Hash值 @@ -204,7 +204,7 @@ public class MurmurHash implements Serializable{ return hash; } - + /** * Murmur3 128-bit Hash值计算 * diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/hash/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/hash/package-info.java index 6dacc1ce3..08ec2a52e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/hash/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/hash/package-info.java @@ -1,6 +1,6 @@ /** * 提供Hash算法的封装 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/AtomicLoader.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/AtomicLoader.java index dfb588753..dfba71d3c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/loader/AtomicLoader.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/loader/AtomicLoader.java @@ -10,9 +10,9 @@ import java.util.concurrent.atomic.AtomicReference; * 1. 检查引用中是否有加载好的对象,有则返回 * 2. 如果没有则初始化一个对象,并再次比较引用中是否有其它线程加载好的对象,无则加入,有则返回已有的 * - * + * * 当对象未被创建,对象的初始化操作在多线程情况下可能会被调用多次(多次创建对象),但是总是返回同一对象 - * + * * @author looly * * @param 被加载对象类型 @@ -44,7 +44,7 @@ public abstract class AtomicLoader implements Loader, Serializable { /** * 初始化被加载的对象
* 如果对象从未被加载过,调用此方法初始化加载对象,此方法只被调用一次 - * + * * @return 被加载的对象 */ protected abstract T init(); diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyLoader.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyLoader.java index e58826d3e..5f9faa950 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyLoader.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyLoader.java @@ -7,7 +7,7 @@ import java.io.Serializable; * 在load方法被调用前,对象未被加载,直到被调用后才开始加载
* 此加载器常用于对象比较庞大而不一定被使用的情况,用于减少启动时资源占用问题
* 此加载器使用双重检查(Double-Check)方式检查对象是否被加载,避免多线程下重复加载或加载丢失问题 - * + * * @author looly * * @param 被加载对象类型 @@ -38,7 +38,7 @@ public abstract class LazyLoader implements Loader, Serializable { /** * 初始化被加载的对象
* 如果对象从未被加载过,调用此方法初始化加载对象,此方法只被调用一次 - * + * * @return 被加载的对象 */ protected abstract T init(); diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/Loader.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/Loader.java index 8f3aa85bb..245126182 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/loader/Loader.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/loader/Loader.java @@ -3,7 +3,7 @@ package cn.hutool.core.lang.loader; /** * 对象加载抽象接口
* 通过实现此接口自定义实现对象的加载方式,例如懒加载机制、多线程加载等 - * + * * @author looly * * @param 对象类型 @@ -14,7 +14,7 @@ public interface Loader { /** * 获取一个准备好的对象
* 通过准备逻辑准备好被加载的对象,然后返回。在准备完毕之前此方法应该被阻塞 - * + * * @return 加载完毕的对象 */ T get(); diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/package-info.java index f54ff4db1..70a00685d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/loader/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/loader/package-info.java @@ -1,6 +1,6 @@ /** * 加载器的抽象接口和实现,包括懒加载的实现等 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/Mutable.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/Mutable.java index 013577b94..e14914014 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/Mutable.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/Mutable.java @@ -2,7 +2,7 @@ package cn.hutool.core.lang.mutable; /** * 提供可变值类型接口 - * + * * @param 值得类型 * @since 3.0.1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java index 86cdc52e4..2edf65727 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java @@ -4,13 +4,13 @@ import java.io.Serializable; /** * 可变 boolean 类型 - * + * * @see Boolean * @since 3.0.1 */ public class MutableBool implements Comparable, Mutable, Serializable { private static final long serialVersionUID = 1L; - + private boolean value; /** @@ -38,7 +38,7 @@ public class MutableBool implements Comparable, Mutable, S @Override public Boolean get() { - return Boolean.valueOf(this.value); + return this.value; } /** @@ -51,7 +51,7 @@ public class MutableBool implements Comparable, Mutable, S @Override public void set(final Boolean value) { - this.value = value.booleanValue(); + this.value = value; } // ----------------------------------------------------------------------- @@ -62,7 +62,7 @@ public class MutableBool implements Comparable, Mutable, S *
  • 类型为 {@link MutableBool}
  • *
  • 值相等
  • * - * + * * @param obj 比对的对象 * @return 相同返回true,否则 false */ @@ -82,7 +82,7 @@ public class MutableBool implements Comparable, Mutable, S // ----------------------------------------------------------------------- /** * 比较 - * + * * @param other 其它 {@link MutableBool} 对象 * @return x==y返回0,x<y返回-1,x>y返回1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java index c08381a9c..0d0755bf8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java @@ -4,13 +4,13 @@ import cn.hutool.core.util.NumberUtil; /** * 可变 byte 类型 - * + * * @see Byte * @since 3.0.1 */ public class MutableByte extends Number implements Comparable, Mutable { private static final long serialVersionUID = 1L; - + private byte value; /** @@ -46,7 +46,7 @@ public class MutableByte extends Number implements Comparable, Muta @Override public Byte get() { - return Byte.valueOf(this.value); + return this.value; } /** @@ -105,7 +105,7 @@ public class MutableByte extends Number implements Comparable, Muta /** * 减去值 - * + * * @param operand 被减的值 * @return this */ @@ -116,7 +116,7 @@ public class MutableByte extends Number implements Comparable, Muta /** * 减去值 - * + * * @param operand 被减的值,非空 * @return this * @throws NullPointerException if the object is null @@ -160,7 +160,7 @@ public class MutableByte extends Number implements Comparable, Muta *
  • 类型为 {@link MutableByte}
  • *
  • 值相等
  • * - * + * * @param obj 比对的对象 * @return 相同返回true,否则 false */ @@ -180,7 +180,7 @@ public class MutableByte extends Number implements Comparable, Muta // ----------------------------------------------------------------------- /** * 比较 - * + * * @param other 其它 {@link MutableByte} 对象 * @return x==y返回0,x<y返回-1,x>y返回1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableDouble.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableDouble.java index 67dd4ee0c..31a72d8bd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableDouble.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableDouble.java @@ -4,13 +4,13 @@ import cn.hutool.core.util.NumberUtil; /** * 可变 double 类型 - * + * * @see Double * @since 3.0.1 */ public class MutableDouble extends Number implements Comparable, Mutable { private static final long serialVersionUID = 1L; - + private double value; /** @@ -46,7 +46,7 @@ public class MutableDouble extends Number implements Comparable, @Override public Double get() { - return Double.valueOf(this.value); + return this.value; } /** @@ -104,7 +104,7 @@ public class MutableDouble extends Number implements Comparable, /** * 减去值 - * + * * @param operand 被减的值 * @return this */ @@ -115,7 +115,7 @@ public class MutableDouble extends Number implements Comparable, /** * 减去值 - * + * * @param operand 被减的值,非空 * @return this */ @@ -153,7 +153,7 @@ public class MutableDouble extends Number implements Comparable, *
  • 类型为 {@link MutableDouble}
  • *
  • 值相等
  • * - * + * * @param obj 比对的对象 * @return 相同返回true,否则 false */ @@ -174,7 +174,7 @@ public class MutableDouble extends Number implements Comparable, // ----------------------------------------------------------------------- /** * 比较 - * + * * @param other 其它 {@link MutableDouble} 对象 * @return x==y返回0,x<y返回-1,x>y返回1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableFloat.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableFloat.java index 40dacdeac..55763acb1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableFloat.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableFloat.java @@ -4,13 +4,13 @@ import cn.hutool.core.util.NumberUtil; /** * 可变 float 类型 - * + * * @see Float * @since 3.0.1 */ public class MutableFloat extends Number implements Comparable, Mutable { private static final long serialVersionUID = 1L; - + private float value; /** @@ -46,7 +46,7 @@ public class MutableFloat extends Number implements Comparable, Mu @Override public Float get() { - return Float.valueOf(this.value); + return this.value; } /** @@ -105,7 +105,7 @@ public class MutableFloat extends Number implements Comparable, Mu /** * 减去值 - * + * * @param operand 被减的值 * @return this */ @@ -116,7 +116,7 @@ public class MutableFloat extends Number implements Comparable, Mu /** * 减去值 - * + * * @param operand 被减的值,非空 * @return this * @throws NullPointerException if the object is null @@ -155,7 +155,7 @@ public class MutableFloat extends Number implements Comparable, Mu *
  • 类型为 {@link MutableFloat}
  • *
  • 值相等
  • * - * + * * @param obj 比对的对象 * @return 相同返回true,否则 false */ @@ -175,7 +175,7 @@ public class MutableFloat extends Number implements Comparable, Mu // ----------------------------------------------------------------------- /** * 比较 - * + * * @param other 其它 {@link MutableFloat} 对象 * @return x==y返回0,x<y返回-1,x>y返回1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableInt.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableInt.java index b661c00de..dce1dd9fc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableInt.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableInt.java @@ -4,13 +4,13 @@ import cn.hutool.core.util.NumberUtil; /** * 可变 int 类型 - * + * * @see Integer * @since 3.0.1 */ public class MutableInt extends Number implements Comparable, Mutable { private static final long serialVersionUID = 1L; - + private int value; /** @@ -46,7 +46,7 @@ public class MutableInt extends Number implements Comparable, Mutabl @Override public Integer get() { - return Integer.valueOf(this.value); + return this.value; } /** @@ -105,7 +105,7 @@ public class MutableInt extends Number implements Comparable, Mutabl /** * 减去值 - * + * * @param operand 被减的值 * @return this */ @@ -116,7 +116,7 @@ public class MutableInt extends Number implements Comparable, Mutabl /** * 减去值 - * + * * @param operand 被减的值,非空 * @return this * @throws NullPointerException if the object is null @@ -155,7 +155,7 @@ public class MutableInt extends Number implements Comparable, Mutabl *
  • 类型为 {@link MutableInt}
  • *
  • 值相等
  • * - * + * * @param obj 比对的对象 * @return 相同返回true,否则 false */ @@ -175,7 +175,7 @@ public class MutableInt extends Number implements Comparable, Mutabl // ----------------------------------------------------------------------- /** * 比较 - * + * * @param other 其它 {@link MutableInt} 对象 * @return x==y返回0,x<y返回-1,x>y返回1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableLong.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableLong.java index add2609f5..e508e1eda 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableLong.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableLong.java @@ -4,13 +4,13 @@ import cn.hutool.core.util.NumberUtil; /** * 可变 long 类型 - * + * * @see Long * @since 3.0.1 */ public class MutableLong extends Number implements Comparable, Mutable { private static final long serialVersionUID = 1L; - + private long value; /** @@ -46,7 +46,7 @@ public class MutableLong extends Number implements Comparable, Muta @Override public Long get() { - return Long.valueOf(this.value); + return this.value; } /** @@ -105,7 +105,7 @@ public class MutableLong extends Number implements Comparable, Muta /** * 减去值 - * + * * @param operand 被减的值 * @return this */ @@ -116,7 +116,7 @@ public class MutableLong extends Number implements Comparable, Muta /** * 减去值 - * + * * @param operand 被减的值,非空 * @return this * @throws NullPointerException if the object is null @@ -155,7 +155,7 @@ public class MutableLong extends Number implements Comparable, Muta *
  • 类型为 {@link MutableLong}
  • *
  • 值相等
  • * - * + * * @param obj 比对的对象 * @return 相同返回true,否则 false */ @@ -175,7 +175,7 @@ public class MutableLong extends Number implements Comparable, Muta // ----------------------------------------------------------------------- /** * 比较 - * + * * @param other 其它 {@link MutableLong} 对象 * @return x==y返回0,x<y返回-1,x>y返回1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java index 433ed5dae..b516c454e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java @@ -4,7 +4,7 @@ import java.io.Serializable; /** * 可变Object - * + * * @param 可变的类型 * @since 3.0.1 */ @@ -21,7 +21,7 @@ public class MutableObj implements Mutable, Serializable { /** * 构造 - * + * * @param value 值 */ public MutableObj(final T value) { diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableShort.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableShort.java index 316804432..7067263cb 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableShort.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableShort.java @@ -4,13 +4,13 @@ import cn.hutool.core.util.NumberUtil; /** * 可变 short 类型 - * + * * @see Short * @since 3.0.1 */ public class MutableShort extends Number implements Comparable, Mutable { private static final long serialVersionUID = 1L; - + private short value; /** @@ -46,7 +46,7 @@ public class MutableShort extends Number implements Comparable, Mu @Override public Short get() { - return Short.valueOf(this.value); + return this.value; } /** @@ -105,7 +105,7 @@ public class MutableShort extends Number implements Comparable, Mu /** * 减去值 - * + * * @param operand 被减的值 * @return this */ @@ -116,7 +116,7 @@ public class MutableShort extends Number implements Comparable, Mu /** * 减去值 - * + * * @param operand 被减的值,非空 * @return this * @throws NullPointerException if the object is null @@ -160,7 +160,7 @@ public class MutableShort extends Number implements Comparable, Mu *
  • 类型为 {@link MutableShort}
  • *
  • 值相等
  • * - * + * * @param obj 比对的对象 * @return 相同返回true,否则 false */ @@ -180,7 +180,7 @@ public class MutableShort extends Number implements Comparable, Mu // ----------------------------------------------------------------------- /** * 比较 - * + * * @param other 其它 {@link MutableShort} 对象 * @return x==y返回0,x<y返回-1,x>y返回1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/package-info.java index 49f17657d..f2a6e86b5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/package-info.java @@ -1,6 +1,6 @@ /** * 提供可变值对象的封装,用于封装int、long等不可变值,使其可变 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/package-info.java index 3c7480924..21575f382 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/package-info.java @@ -1,6 +1,6 @@ /** * 语言特性包,包括大量便捷的数据结构,例如验证器Validator,分布式ID生成器Snowflake等 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java index c33e63873..30eac9adf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java @@ -1,8 +1,15 @@ package cn.hutool.core.lang.tree; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -152,8 +159,32 @@ public class Tree extends LinkedHashMap implements Node { return (List>) this.get(treeNodeConfig.getChildrenKey()); } - public void setChildren(List> children) { + public Tree setChildren(List> children) { this.put(treeNodeConfig.getChildrenKey(), children); + return this; + } + + /** + * 增加子节点,同时关联子节点的父节点为当前节点 + * + * @param children 子节点列表 + * @return this + * @since 5.6.7 + */ + @SafeVarargs + public final Tree addChildren(Tree... children){ + if(ArrayUtil.isNotEmpty(children)){ + List> childrenList = this.getChildren(); + if(null == childrenList){ + childrenList = new ArrayList<>(); + setChildren(childrenList); + } + for (Tree child : children) { + child.setParent(this); + childrenList.add(child); + } + } + return this; } /** @@ -166,4 +197,29 @@ public class Tree extends LinkedHashMap implements Node { Assert.notEmpty(key, "Key must be not empty !"); this.put(key, value); } -} \ No newline at end of file + + @Override + public String toString() { + final StringWriter stringWriter = new StringWriter(); + printTree(this, new PrintWriter(stringWriter), 0); + return stringWriter.toString(); + } + + /** + * 打印 + * @param tree 树 + * @param writer Writer + * @param intent 缩进量 + */ + private static void printTree(Tree tree, PrintWriter writer, int intent){ + writer.println(StrUtil.format("{}{}[{}]", StrUtil.repeat(CharUtil.SPACE, intent), tree.getName(), tree.getId())); + writer.flush(); + + final List> children = tree.getChildren(); + if(CollUtil.isNotEmpty(children)){ + for (Tree child : children) { + printTree(child, writer, intent + 2); + } + } + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java index 1babcc1fb..45ada39ad 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java @@ -3,11 +3,13 @@ package cn.hutool.core.lang.tree; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.parser.DefaultNodeParser; import cn.hutool.core.lang.tree.parser.NodeParser; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; /** * 树工具类 @@ -58,65 +60,49 @@ public class TreeUtil { * @param 转换的实体 为数据源里的对象类型 * @param ID类型 * @param list 源数据集合 - * @param parentId 最顶层父id值 一般为 0 之类 + * @param rootId 最顶层父id值 一般为 0 之类 * @param treeNodeConfig 配置 * @param nodeParser 转换器 * @return List */ - public static List> build(List list, E parentId, TreeNodeConfig treeNodeConfig, NodeParser nodeParser) { - final List> treeList = CollUtil.newArrayList(); - Tree tree; - for (T obj : list) { - tree = new Tree<>(treeNodeConfig); - nodeParser.parse(obj, tree); - treeList.add(tree); + public static List> build(List list, E rootId, TreeNodeConfig treeNodeConfig, NodeParser nodeParser) { + final Map> map = new LinkedHashMap<>(list.size(), 1); + Tree node; + for (T t : list) { + node = new Tree<>(treeNodeConfig); + nodeParser.parse(t, node); + map.put(node.getId(), node); } - List> finalTreeList = CollUtil.newArrayList(); - for (Tree node : treeList) { - if (ObjectUtil.equals(parentId,node.getParentId())) { - finalTreeList.add(node); - innerBuild(treeList, node, 0, treeNodeConfig.getDeep()); - } - } - // 内存每层已经排过了 这是最外层排序 - finalTreeList = finalTreeList.stream().sorted().collect(Collectors.toList()); - return finalTreeList; + return build(map, rootId); } /** - * 递归处理 + * 树构建,按照权重排序 * - * @param treeNodes 数据集合 - * @param parentNode 当前节点 - * @param deep 已递归深度 - * @param maxDeep 最大递归深度 可能为null即不限制 + * @param ID类型 + * @param map 源数据Map + * @param rootId 最顶层父id值 一般为 0 之类 + * @return List + * @since 5.6.7 */ - private static void innerBuild(List> treeNodes, Tree parentNode, int deep, Integer maxDeep) { + public static List> build(Map> map, E rootId) { + final Map> eTreeMap = MapUtil.sortByValue(map, false); + List> rootTreeList = CollUtil.newArrayList(); + E parentId; + for (Tree node : eTreeMap.values()) { + parentId = node.getParentId(); + if(ObjectUtil.equals(rootId, parentId)){ + rootTreeList.add(node); + continue; + } - if (CollUtil.isEmpty(treeNodes)) { - return; - } - //maxDeep 可能为空 - if (maxDeep != null && deep >= maxDeep) { - return; - } - - // 每层排序 TreeNodeMap 实现了Comparable接口 - treeNodes = treeNodes.stream().sorted().collect(Collectors.toList()); - for (Tree childNode : treeNodes) { - if (parentNode.getId().equals(childNode.getParentId())) { - List> children = parentNode.getChildren(); - if (children == null) { - children = CollUtil.newArrayList(); - parentNode.setChildren(children); - } - children.add(childNode); -// childNode.setParentId(parentNode.getId()); - childNode.setParent(parentNode); - innerBuild(treeNodes, childNode, deep + 1, maxDeep); + final Tree parentNode = map.get(parentId); + if(null != parentNode){ + parentNode.addChildren(node); } } + return rootTreeList; } /** @@ -138,7 +124,7 @@ public class TreeUtil { if(null == children) { return null; } - + // 查找子节点 Tree childNode; for (Tree child : children) { @@ -182,5 +168,4 @@ public class TreeUtil { } return result; } - } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java index 42c3eaed9..ea1642d14 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java @@ -8,7 +8,7 @@ import cn.hutool.core.util.StrUtil; /** * 驼峰Key风格的Map
    * 对KEY转换为驼峰,get("int_value")和get("intValue")获得的值相同,put进入的值也会被覆盖 - * + * * @author Looly * * @param 键类型 @@ -28,7 +28,7 @@ public class CamelCaseMap extends CustomKeyMap { /** * 构造 - * + * * @param initialCapacity 初始大小 */ public CamelCaseMap(int initialCapacity) { @@ -37,7 +37,7 @@ public class CamelCaseMap extends CustomKeyMap { /** * 构造 - * + * * @param m Map */ public CamelCaseMap(Map m) { @@ -46,7 +46,7 @@ public class CamelCaseMap extends CustomKeyMap { /** * 构造 - * + * * @param loadFactor 加载因子 * @param m Map */ @@ -57,7 +57,7 @@ public class CamelCaseMap extends CustomKeyMap { /** * 构造 - * + * * @param initialCapacity 初始大小 * @param loadFactor 加载因子 */ @@ -68,7 +68,7 @@ public class CamelCaseMap extends CustomKeyMap { /** * 将Key转为驼峰风格,如果key为字符串的话 - * + * * @param key KEY * @return 驼峰Key */ diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveMap.java index 95c304a17..0c892b268 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveMap.java @@ -6,7 +6,7 @@ import java.util.Map; /** * 忽略大小写的Map
    * 对KEY忽略大小写,get("Value")和get("value")获得的值相同,put进入的值也会被覆盖 - * + * * @author Looly * * @param 键类型 @@ -26,7 +26,7 @@ public class CaseInsensitiveMap extends CustomKeyMap { /** * 构造 - * + * * @param initialCapacity 初始大小 */ public CaseInsensitiveMap(int initialCapacity) { @@ -35,7 +35,7 @@ public class CaseInsensitiveMap extends CustomKeyMap { /** * 构造 - * + * * @param m Map */ public CaseInsensitiveMap(Map m) { @@ -44,7 +44,7 @@ public class CaseInsensitiveMap extends CustomKeyMap { /** * 构造 - * + * * @param loadFactor 加载因子 * @param m Map * @since 3.1.2 @@ -53,10 +53,10 @@ public class CaseInsensitiveMap extends CustomKeyMap { this(m.size(), loadFactor); this.putAll(m); } - + /** * 构造 - * + * * @param initialCapacity 初始大小 * @param loadFactor 加载因子 */ @@ -67,7 +67,7 @@ public class CaseInsensitiveMap extends CustomKeyMap { /** * 将Key转为小写 - * + * * @param key KEY * @return 小写KEY */ diff --git a/hutool-core/src/main/java/cn/hutool/core/map/FixedLinkedHashMap.java b/hutool-core/src/main/java/cn/hutool/core/map/FixedLinkedHashMap.java index 1de25da6c..1559fde7a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/FixedLinkedHashMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/FixedLinkedHashMap.java @@ -4,7 +4,7 @@ import java.util.LinkedHashMap; /** * 固定大小的{@link LinkedHashMap} 实现 - * + * * @author looly * * @param 键类型 @@ -15,10 +15,10 @@ public class FixedLinkedHashMap extends LinkedHashMap { /** 容量,超过此容量自动删除末尾元素 */ private int capacity; - + /** * 构造 - * + * * @param capacity 容量,实际初始容量比容量大1 */ public FixedLinkedHashMap(int capacity) { @@ -28,7 +28,7 @@ public class FixedLinkedHashMap extends LinkedHashMap { /** * 获取容量 - * + * * @return 容量 */ public int getCapacity() { @@ -37,7 +37,7 @@ public class FixedLinkedHashMap extends LinkedHashMap { /** * 设置容量 - * + * * @param capacity 容量 */ public void setCapacity(int capacity) { diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java b/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java index fb6be7f92..3787a2ef8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java @@ -5,14 +5,14 @@ import java.util.Map; /** * Map创建类 - * + * * @param Key类型 * @param Value类型 * @since 3.1.1 */ public class MapBuilder implements Serializable{ private static final long serialVersionUID = 1L; - + private final Map map; /** @@ -42,7 +42,7 @@ public class MapBuilder implements Serializable{ /** * 创建Builder - * + * * @param Key类型 * @param Value类型 * @param map Map实体类 @@ -55,7 +55,7 @@ public class MapBuilder implements Serializable{ /** * 链式Map创建类 - * + * * @param map 要使用的Map实现类 */ public MapBuilder(Map map) { @@ -64,7 +64,7 @@ public class MapBuilder implements Serializable{ /** * 链式Map创建 - * + * * @param k Key类型 * @param v Value类型 * @return 当前类 @@ -76,7 +76,7 @@ public class MapBuilder implements Serializable{ /** * 链式Map创建 - * + * * @param map 合并map * @return 当前类 */ @@ -87,16 +87,16 @@ public class MapBuilder implements Serializable{ /** * 创建后的map - * + * * @return 创建后的map */ public Map map() { return map; } - + /** * 创建后的map - * + * * @return 创建后的map * @since 3.3.0 */ @@ -106,7 +106,7 @@ public class MapBuilder implements Serializable{ /** * 将map转成字符串 - * + * * @param separator entry之间的连接符 * @param keyValueSeparator kv之间的连接符 * @return 连接字符串 @@ -117,7 +117,7 @@ public class MapBuilder implements Serializable{ /** * 将map转成字符串 - * + * * @param separator entry之间的连接符 * @param keyValueSeparator kv之间的连接符 * @return 连接后的字符串 @@ -128,7 +128,7 @@ public class MapBuilder implements Serializable{ /** * 将map转成字符串 - * + * * @param separator entry之间的连接符 * @param keyValueSeparator kv之间的连接符 * @param isIgnoreNull 是否忽略null的键和值 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java index 02167df7d..6fe603ec6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java @@ -17,7 +17,7 @@ import java.util.Set; /** * Map代理,提供各种getXXX方法,并提供默认值支持 - * + * * @author looly * @since 3.2.0 */ @@ -30,7 +30,7 @@ public class MapProxy implements Map, OptNullBasicTypeFromObject /** * 创建代理Map
    * 此类对Map做一次包装,提供各种getXXX方法 - * + * * @param map 被代理的Map * @return {@link MapProxy} */ @@ -40,7 +40,7 @@ public class MapProxy implements Map, OptNullBasicTypeFromObject /** * 构造 - * + * * @param map 被代理的Map */ public MapProxy(Map map) { @@ -138,7 +138,7 @@ public class MapProxy implements Map, OptNullBasicTypeFromObject } else if ("toString".equals(methodName)) { return this.toString(); } - + if (StrUtil.isNotBlank(fieldName)) { if (false == this.containsKey(fieldName)) { // 驼峰不存在转下划线尝试 @@ -163,7 +163,7 @@ public class MapProxy implements Map, OptNullBasicTypeFromObject throw new UnsupportedOperationException(method.toGenericString()); } - + /** * 将Map代理为指定接口的动态代理对象 * diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java index cf1c04d15..7b69aada4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java @@ -9,7 +9,7 @@ import java.util.Map; /** * 值作为集合的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示 - * + * * @author looly * * @param 键类型 @@ -33,7 +33,7 @@ public abstract class CollectionValueMap extends MapWrapper extends MapWrapper> m) { @@ -51,7 +51,7 @@ public abstract class CollectionValueMap extends MapWrapper extends MapWrapper extends MapWrapper * 如果键对应值列表有值,加入,否则创建一个新列表后加入 - * + * * @param key 键 * @param value 值 */ @@ -89,7 +89,7 @@ public abstract class CollectionValueMap extends MapWrapper extends MapWrapper * 此方法用于创建在putValue后追加值所在的集合,子类实现此方法创建不同类型的集合 - * + * * @return {@link Collection} */ protected abstract Collection createCollection(); diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java index c2e7d0403..0201d1470 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java @@ -8,7 +8,7 @@ import java.util.Map; /** * 值作为集合List的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示 - * + * * @author looly * * @param 键类型 @@ -28,7 +28,7 @@ public class ListValueMap extends CollectionValueMap { /** * 构造 - * + * * @param initialCapacity 初始大小 */ public ListValueMap(int initialCapacity) { @@ -37,7 +37,7 @@ public class ListValueMap extends CollectionValueMap { /** * 构造 - * + * * @param m Map */ public ListValueMap(Map> m) { @@ -46,7 +46,7 @@ public class ListValueMap extends CollectionValueMap { /** * 构造 - * + * * @param loadFactor 加载因子 * @param m Map */ @@ -57,7 +57,7 @@ public class ListValueMap extends CollectionValueMap { /** * 构造 - * + * * @param initialCapacity 初始大小 * @param loadFactor 加载因子 */ @@ -70,7 +70,7 @@ public class ListValueMap extends CollectionValueMap { public List get(Object key) { return (List) super.get(key); } - + @Override protected Collection createCollection() { return new ArrayList<>(DEFAULT_COLLCTION_INITIAL_CAPACITY); diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java index 9515835fb..58d492504 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java @@ -8,7 +8,7 @@ import java.util.Set; /** * 值作为集合Set(LinkedHashSet)的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示 - * + * * @author looly * * @param 键类型 @@ -28,7 +28,7 @@ public class SetValueMap extends CollectionValueMap { /** * 构造 - * + * * @param initialCapacity 初始大小 */ public SetValueMap(int initialCapacity) { @@ -37,7 +37,7 @@ public class SetValueMap extends CollectionValueMap { /** * 构造 - * + * * @param m Map */ public SetValueMap(Map> m) { @@ -46,7 +46,7 @@ public class SetValueMap extends CollectionValueMap { /** * 构造 - * + * * @param loadFactor 加载因子 * @param m Map */ @@ -57,7 +57,7 @@ public class SetValueMap extends CollectionValueMap { /** * 构造 - * + * * @param initialCapacity 初始大小 * @param loadFactor 加载因子 */ @@ -70,7 +70,7 @@ public class SetValueMap extends CollectionValueMap { public Set get(Object key) { return (Set) super.get(key); } - + @Override protected Collection createCollection() { return new LinkedHashSet<>(DEFAULT_COLLCTION_INITIAL_CAPACITY); diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/package-info.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/package-info.java index 978a2fd0c..b0a2bcd20 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/multi/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/package-info.java @@ -1,6 +1,6 @@ /** * 列表类型值的Map实现 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/map/package-info.java b/hutool-core/src/main/java/cn/hutool/core/map/package-info.java index e114142da..4316fcb89 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/package-info.java @@ -1,6 +1,6 @@ /** * Map相关封装,提供特殊Map实现以及Map工具MapUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/math/Arrangement.java b/hutool-core/src/main/java/cn/hutool/core/math/Arrangement.java index d54150b71..d04edc82d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/Arrangement.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/Arrangement.java @@ -11,7 +11,7 @@ import cn.hutool.core.util.NumberUtil; /** * 排列A(n, m)
    * 排列组合相关类 参考:http://cgs1999.iteye.com/blog/2327664 - * + * * @author looly * @since 4.0.7 */ @@ -22,7 +22,7 @@ public class Arrangement implements Serializable { /** * 构造 - * + * * @param datas 用于排列的数据 */ public Arrangement(String[] datas) { @@ -31,7 +31,7 @@ public class Arrangement implements Serializable { /** * 计算排列数,即A(n, n) = n! - * + * * @param n 总数 * @return 排列数 */ @@ -41,7 +41,7 @@ public class Arrangement implements Serializable { /** * 计算排列数,即A(n, m) = n!/(n-m)! - * + * * @param n 总数 * @param m 选择的个数 * @return 排列数 @@ -55,7 +55,7 @@ public class Arrangement implements Serializable { /** * 计算排列总数,即A(n, 1) + A(n, 2) + A(n, 3)... - * + * * @param n 总数 * @return 排列数 */ @@ -69,7 +69,7 @@ public class Arrangement implements Serializable { /** * 全排列选择(列表全部参与排列) - * + * * @return 所有排列列表 */ public List select() { @@ -78,7 +78,7 @@ public class Arrangement implements Serializable { /** * 排列选择(从列表中选择m个排列) - * + * * @param m 选择个数 * @return 所有排列列表 */ @@ -90,7 +90,7 @@ public class Arrangement implements Serializable { /** * 排列所有组合,即A(n, 1) + A(n, 2) + A(n, 3)... - * + * * @return 全排列结果 */ public List selectAll() { @@ -104,7 +104,7 @@ public class Arrangement implements Serializable { /** * 排列选择
    * 排列方式为先从数据数组中取出一个元素,再把剩余的元素作为新的基数,依次列推,直到选择到足够的元素 - * + * * @param datas 选择的基数 * @param resultList 前面(resultIndex-1)个的排列结果 * @param resultIndex 选择索引,从0开始 diff --git a/hutool-core/src/main/java/cn/hutool/core/math/MathUtil.java b/hutool-core/src/main/java/cn/hutool/core/math/MathUtil.java index b9d2178ed..29f6eb188 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/MathUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/MathUtil.java @@ -5,7 +5,7 @@ import java.util.List; /** * 数学相关方法工具类
    * 此工具类与{@link cn.hutool.core.util.NumberUtil}属于一类工具,NumberUtil偏向于简单数学计算的封装,MathUtil偏向复杂数学计算 - * + * * @author looly * @since 4.0.7 */ @@ -14,7 +14,7 @@ public class MathUtil { //--------------------------------------------------------------------------------------------- Arrangement /** * 计算排列数,即A(n, m) = n!/(n-m)! - * + * * @param n 总数 * @param m 选择的个数 * @return 排列数 @@ -22,10 +22,10 @@ public class MathUtil { public static long arrangementCount(int n, int m) { return Arrangement.count(n, m); } - + /** * 计算排列数,即A(n, n) = n! - * + * * @param n 总数 * @return 排列数 */ @@ -35,7 +35,7 @@ public class MathUtil { /** * 排列选择(从列表中选择n个排列) - * + * * @param datas 待选列表 * @param m 选择个数 * @return 所有排列列表 @@ -43,21 +43,21 @@ public class MathUtil { public static List arrangementSelect(String[] datas, int m) { return new Arrangement(datas).select(m); } - + /** * 全排列选择(列表全部参与排列) - * + * * @param datas 待选列表 * @return 所有排列列表 */ public static List arrangementSelect(String[] datas) { return new Arrangement(datas).select(); } - + //--------------------------------------------------------------------------------------------- Combination /** * 计算组合数,即C(n, m) = n!/((n-m)! * m!) - * + * * @param n 总数 * @param m 选择的个数 * @return 组合数 @@ -68,7 +68,7 @@ public class MathUtil { /** * 组合选择(从列表中选择n个组合) - * + * * @param datas 待选列表 * @param m 选择个数 * @return 所有组合列表 diff --git a/hutool-core/src/main/java/cn/hutool/core/math/package-info.java b/hutool-core/src/main/java/cn/hutool/core/math/package-info.java index a71eaa98b..18b5d86e8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/package-info.java @@ -1,6 +1,6 @@ /** * 提供数学计算相关封装,包括排列组合等,入口为MathUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/net/LocalPortGenerater.java b/hutool-core/src/main/java/cn/hutool/core/net/LocalPortGenerater.java index d8aa40f76..4ac68d515 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/LocalPortGenerater.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/LocalPortGenerater.java @@ -7,7 +7,7 @@ import java.util.concurrent.atomic.AtomicInteger; * 本地端口生成器
    * 用于生成本地可用(未被占用)的端口号
    * 注意:多线程甚至单线程访问时可能会返回同一端口(例如获取了端口但是没有使用) - * + * * @author looly * @since 4.0.3 * @@ -20,7 +20,7 @@ public class LocalPortGenerater implements Serializable{ /** * 构造 - * + * * @param beginPort 起始端口号 */ public LocalPortGenerater(int beginPort) { @@ -29,7 +29,7 @@ public class LocalPortGenerater implements Serializable{ /** * 生成一个本地端口,用于远程端口映射 - * + * * @return 未被使用的本地端口 */ public int generate() { diff --git a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java index 0797b1677..ec40ab6a1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java @@ -243,7 +243,7 @@ public class NetUtil { long cBegin = NetUtil.ipv4ToLong("192.168.0.0"); long cEnd = NetUtil.ipv4ToLong("192.168.255.255"); - isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals(LOCAL_IP); + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || LOCAL_IP.equals(ipAddress); return isInnerIp; } diff --git a/hutool-core/src/main/java/cn/hutool/core/net/multipart/package-info.java b/hutool-core/src/main/java/cn/hutool/core/net/multipart/package-info.java index c5650279a..630081ce3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/multipart/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/multipart/package-info.java @@ -1,6 +1,6 @@ /** * 文件上传封装 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/net/package-info.java b/hutool-core/src/main/java/cn/hutool/core/net/package-info.java index 0dbeaae52..a1f6dcbd6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/package-info.java @@ -1,6 +1,6 @@ /** * 网络相关工具 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/package-info.java b/hutool-core/src/main/java/cn/hutool/core/net/url/package-info.java index e2bc76dde..d33494c27 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/url/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/url/package-info.java @@ -1,6 +1,6 @@ /** * URL相关工具 - * + * * @author looly * @since 5.3.1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/package-info.java b/hutool-core/src/main/java/cn/hutool/core/package-info.java index adefb5647..2738a53ee 100644 --- a/hutool-core/src/main/java/cn/hutool/core/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/package-info.java @@ -1,6 +1,6 @@ /** * Hutool核心方法及数据结构包 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java b/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java new file mode 100644 index 000000000..58b03d2ba --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java @@ -0,0 +1,64 @@ +package cn.hutool.core.stream; + +import cn.hutool.core.util.StrUtil; + +import java.util.Collections; +import java.util.StringJoiner; +import java.util.function.Function; +import java.util.stream.Collector; + +/** + * 可变的汇聚操作{@link Collector} 相关工具封装 + * + * @author looly + * @since 5.6.7 + */ +public class CollectorUtil { + + /** + * 提供任意对象的Join操作的{@link Collector}实现,对象默认调用toString方法 + * + * @param delimiter 分隔符 + * @param 对象类型 + * @return {@link Collector} + */ + public static Collector joining(CharSequence delimiter) { + return joining(delimiter, Object::toString); + } + + /** + * 提供任意对象的Join操作的{@link Collector}实现 + * + * @param delimiter 分隔符 + * @param toStringFunc 自定义指定对象转换为字符串的方法 + * @param 对象类型 + * @return {@link Collector} + */ + public static Collector joining(CharSequence delimiter, + Function toStringFunc) { + return joining(delimiter, StrUtil.EMPTY, StrUtil.EMPTY, toStringFunc); + } + + /** + * 提供任意对象的Join操作的{@link Collector}实现 + * + * @param delimiter 分隔符 + * @param prefix 前缀 + * @param suffix 后缀 + * @param toStringFunc 自定义指定对象转换为字符串的方法 + * @param 对象类型 + * @return {@link Collector} + */ + public static Collector joining(CharSequence delimiter, + CharSequence prefix, + CharSequence suffix, + Function toStringFunc) { + return new SimpleCollector<>( + () -> new StringJoiner(delimiter, prefix, suffix), + (joiner, ele) -> joiner.add(toStringFunc.apply(ele)), + StringJoiner::merge, + StringJoiner::toString, + Collections.emptySet() + ); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/SimpleCollector.java b/hutool-core/src/main/java/cn/hutool/core/stream/SimpleCollector.java new file mode 100644 index 000000000..c1c87dac6 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/stream/SimpleCollector.java @@ -0,0 +1,109 @@ +package cn.hutool.core.stream; + +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collector; + +/** + * 简单{@link Collector}接口实现 + * + * @param 输入数据类型 + * @param 累积结果的容器类型 + * @param 数据结果类型 + * @since 5.6.7 + */ +public class SimpleCollector implements Collector { + /** + * 创建新的结果容器,容器类型为A + */ + private final Supplier supplier; + /** + * 将输入元素合并到结果容器中 + */ + private final BiConsumer accumulator; + /** + * 合并两个结果容器(并行流使用,将多个线程产生的结果容器合并) + */ + private final BinaryOperator combiner; + /** + * 将结果容器转换成最终的表示 + */ + private final Function finisher; + /** + * 特征值枚举,见{@link Characteristics} + *
      + *
    • CONCURRENT: 表示结果容器只有一个(即使是在并行流的情况下)。 + * 只有在并行流且收集器不具备此特性的情况下,combiner()返回的lambda表达式才会执行(中间结果容器只有一个就无需合并)。 + * 设置此特性时意味着多个线程可以对同一个结果容器调用,因此结果容器必须是线程安全的。
    • + *
    • UNORDERED: 表示流中的元素无序
    • + *
    • IDENTITY_FINISH:表示中间结果容器类型与最终结果类型一致。设置此特性时finiser()方法不会被调用
    • + *
    + */ + private final Set characteristics; + + /** + * 构造 + * + * @param supplier 创建新的结果容器函数 + * @param accumulator 将输入元素合并到结果容器中函数 + * @param combiner 合并两个结果容器函数(并行流使用,将多个线程产生的结果容器合并) + * @param finisher 将结果容器转换成最终的表示函数 + * @param characteristics 特征值枚举 + */ + public SimpleCollector(Supplier
    supplier, + BiConsumer accumulator, + BinaryOperator combiner, + Function finisher, + Set characteristics) { + this.supplier = supplier; + this.accumulator = accumulator; + this.combiner = combiner; + this.finisher = finisher; + this.characteristics = characteristics; + } + + /** + * 构造 + * + * @param supplier 创建新的结果容器函数 + * @param accumulator 将输入元素合并到结果容器中函数 + * @param combiner 合并两个结果容器函数(并行流使用,将多个线程产生的结果容器合并) + * @param characteristics 特征值枚举 + */ + @SuppressWarnings("unchecked") + public SimpleCollector(Supplier supplier, + BiConsumer accumulator, + BinaryOperator combiner, + Set characteristics) { + this(supplier, accumulator, combiner, i -> (R) i, characteristics); + } + + @Override + public BiConsumer accumulator() { + return accumulator; + } + + @Override + public Supplier supplier() { + return supplier; + } + + @Override + public BinaryOperator combiner() { + return combiner; + } + + @Override + public Function finisher() { + return finisher; + } + + @Override + public Set characteristics() { + return characteristics; + } + +} diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java new file mode 100644 index 000000000..b3e04bbfc --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java @@ -0,0 +1,144 @@ +package cn.hutool.core.stream; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.CharsetUtil; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Spliterators; +import java.util.function.Function; +import java.util.function.UnaryOperator; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +/** + * {@link Stream} 工具类 + * + * @author looly + * @since 5.6.7 + */ +public class StreamUtil { + + @SafeVarargs + public static Stream of(T... array) { + Assert.notNull(array, "Array must be not null!"); + return Stream.of(array); + } + + /** + * {@link Iterable}转换为{@link Stream},默认非并行 + * + * @param iterable 集合 + * @param 集合元素类型 + * @return {@link Stream} + */ + public static Stream of(Iterable iterable) { + return of(iterable, false); + } + + /** + * {@link Iterable}转换为{@link Stream} + * + * @param iterable 集合 + * @param parallel 是否并行 + * @param 集合元素类型 + * @return {@link Stream} + */ + public static Stream of(Iterable iterable, boolean parallel) { + Assert.notNull(iterable, "Iterable must be not null!"); + return StreamSupport.stream( + Spliterators.spliterator(CollUtil.toCollection(iterable), 0), + parallel); + } + + /** + * 按行读取文件为{@link Stream} + * + * @param file 文件 + * @return {@link Stream} + */ + public static Stream of(File file) { + return of(file, CharsetUtil.CHARSET_UTF_8); + } + + /** + * 按行读取文件为{@link Stream} + * + * @param path 路径 + * @return {@link Stream} + */ + public static Stream of(Path path) { + return of(path, CharsetUtil.CHARSET_UTF_8); + } + + /** + * 按行读取文件为{@link Stream} + * + * @param file 文件 + * @param charset 编码 + * @return {@link Stream} + */ + public static Stream of(File file, Charset charset) { + Assert.notNull(file, "File must be not null!"); + return of(file.toPath(), charset); + } + + /** + * 按行读取文件为{@link Stream} + * + * @param path 路径 + * @param charset 编码 + * @return {@link Stream} + */ + public static Stream of(Path path, Charset charset) { + try { + return Files.lines(path, charset); + } catch (IOException e) { + throw new IORuntimeException(e); + } + } + + /** + * 通过函数创建Stream + * + * @param seed 初始值 + * @param elementCreator 递进函数,每次调用此函数获取下一个值 + * @param limit 限制个数 + * @param 创建元素类型 + * @return {@link Stream} + */ + public static Stream of(T seed, UnaryOperator elementCreator, int limit) { + return Stream.iterate(seed, elementCreator).limit(limit); + } + + /** + * 将Stream中所有元素以指定分隔符,合并为一个字符串,对象默认调用toString方法 + * + * @param stream {@link Stream} + * @param delimiter 分隔符 + * @param 元素类型 + * @return 字符串 + */ + public static String join(Stream stream, CharSequence delimiter) { + return stream.collect(CollectorUtil.joining(delimiter)); + } + + /** + * 将Stream中所有元素以指定分隔符,合并为一个字符串 + * + * @param stream {@link Stream} + * @param delimiter 分隔符 + * @param toStringFunc 元素转换为字符串的函数 + * @param 元素类型 + * @return 字符串 + */ + public static String join(Stream stream, CharSequence delimiter, + Function toStringFunc) { + return stream.collect(CollectorUtil.joining(delimiter, toStringFunc)); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/package-info.java b/hutool-core/src/main/java/cn/hutool/core/stream/package-info.java new file mode 100644 index 000000000..155cf24db --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/stream/package-info.java @@ -0,0 +1,7 @@ +/** + * Java8的stream相关封装 + * + * @author looly + * + */ +package cn.hutool.core.stream; diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/DesktopUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/DesktopUtil.java index 8bb40d29e..da9d2afde 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/DesktopUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/DesktopUtil.java @@ -11,7 +11,7 @@ import cn.hutool.core.util.URLUtil; /** * 桌面相关工具(平台相关)
    * Desktop 类允许 Java 应用程序启动已在本机桌面上注册的关联应用程序,以处理 URI 或文件。 - * + * * @author looly * @since 4.5.7 */ @@ -19,7 +19,7 @@ public class DesktopUtil { /** * 获得{@link Desktop} - * + * * @return {@link Desktop} */ public static Desktop getDsktop() { @@ -28,16 +28,16 @@ public class DesktopUtil { /** * 使用平台默认浏览器打开指定URL地址 - * + * * @param url URL地址 */ public static void browse(String url) { browse(URLUtil.toURI(url)); } - + /** * 使用平台默认浏览器打开指定URI地址 - * + * * @param uri URI地址 * @since 4.6.3 */ @@ -52,7 +52,7 @@ public class DesktopUtil { /** * 启动关联应用程序来打开文件 - * + * * @param file URL地址 */ public static void open(File file) { @@ -66,7 +66,7 @@ public class DesktopUtil { /** * 启动关联编辑器应用程序并打开用于编辑的文件 - * + * * @param file 文件 */ public static void edit(File file) { @@ -80,7 +80,7 @@ public class DesktopUtil { /** * 使用关联应用程序的打印命令, 用本机桌面打印设备来打印文件 - * + * * @param file 文件 */ public static void print(File file) { @@ -94,7 +94,7 @@ public class DesktopUtil { /** * 使用平台默认浏览器打开指定URL地址 - * + * * @param mailAddress 邮件地址 */ public static void mail(String mailAddress) { diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java index c49f76ccd..6d3c31340 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java @@ -14,7 +14,7 @@ import cn.hutool.core.swing.clipboard.ClipboardUtil; /** * {@link Robot} 封装工具类,提供截屏等工具 - * + * * @author looly * @since 4.1.14 */ @@ -34,7 +34,7 @@ public class RobotUtil { /** * 设置默认的延迟时间
    * 当按键执行完后的等待时间,也可以用ThreadUtil.sleep方法代替 - * + * * @param delayMillis 等待毫秒数 * @since 4.5.7 */ @@ -44,7 +44,7 @@ public class RobotUtil { /** * 模拟鼠标移动 - * + * * @param x 移动到的x坐标 * @param y 移动到的y坐标 * @since 4.5.7 @@ -56,7 +56,7 @@ public class RobotUtil { /** * 模拟单击
    * 鼠标单击包括鼠标左键的按下和释放 - * + * * @since 4.5.7 */ public static void click() { @@ -68,7 +68,7 @@ public class RobotUtil { /** * 模拟右键单击
    * 鼠标单击包括鼠标右键的按下和释放 - * + * * @since 4.5.7 */ public static void rightClick() { @@ -79,7 +79,7 @@ public class RobotUtil { /** * 模拟鼠标滚轮滚动 - * + * * @param wheelAmt 滚动数,负数表示向前滚动,正数向后滚动 * @since 4.5.7 */ @@ -91,7 +91,7 @@ public class RobotUtil { /** * 模拟键盘点击
    * 包括键盘的按下和释放 - * + * * @param keyCodes 按键码列表,见{@link java.awt.event.KeyEvent} * @since 4.5.7 */ @@ -105,7 +105,7 @@ public class RobotUtil { /** * 打印输出指定字符串(借助剪贴板) - * + * * @param str 字符串 */ public static void keyPressString(String str) { @@ -116,7 +116,7 @@ public class RobotUtil { /** * shift+ 按键 - * + * * @param key 按键 */ public static void keyPressWithShift(int key) { @@ -129,7 +129,7 @@ public class RobotUtil { /** * ctrl+ 按键 - * + * * @param key 按键 */ public static void keyPressWithCtrl(int key) { @@ -142,7 +142,7 @@ public class RobotUtil { /** * alt+ 按键 - * + * * @param key 按键 */ public static void keyPressWithAlt(int key) { @@ -155,7 +155,7 @@ public class RobotUtil { /** * 截取全屏 - * + * * @return 截屏的图片 */ public static BufferedImage captureScreen() { @@ -164,7 +164,7 @@ public class RobotUtil { /** * 截取全屏到文件 - * + * * @param outFile 写出到的文件 * @return 写出到的文件 */ @@ -175,7 +175,7 @@ public class RobotUtil { /** * 截屏 - * + * * @param screenRect 截屏的矩形区域 * @return 截屏的图片 */ @@ -185,7 +185,7 @@ public class RobotUtil { /** * 截屏 - * + * * @param screenRect 截屏的矩形区域 * @param outFile 写出到的文件 * @return 写出到的文件 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java index 9f3f087b9..047eabb5f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java @@ -8,7 +8,7 @@ import java.io.File; /** * 屏幕相关(当前显示设置)工具类 - * + * * @author looly * @since 4.1.14 */ @@ -17,7 +17,7 @@ public class ScreenUtil { /** * 获取屏幕宽度 - * + * * @return 屏幕宽度 */ public static int getWidth() { @@ -26,13 +26,13 @@ public class ScreenUtil { /** * 获取屏幕高度 - * + * * @return 屏幕高度 */ public static int getHeight() { return (int) dimension.getHeight(); } - + /** * 获取屏幕的矩形 * @return 屏幕的矩形 @@ -40,11 +40,11 @@ public class ScreenUtil { public static Rectangle getRectangle() { return new Rectangle(getWidth(), getHeight()); } - + //-------------------------------------------------------------------------------------------- 截屏 /** * 截取全屏 - * + * * @return 截屏的图片 * @see RobotUtil#captureScreen() */ @@ -54,7 +54,7 @@ public class ScreenUtil { /** * 截取全屏到文件 - * + * * @param outFile 写出到的文件 * @return 写出到的文件 * @see RobotUtil#captureScreen(File) @@ -65,7 +65,7 @@ public class ScreenUtil { /** * 截屏 - * + * * @param screenRect 截屏的矩形区域 * @return 截屏的图片 * @see RobotUtil#captureScreen(Rectangle) @@ -76,7 +76,7 @@ public class ScreenUtil { /** * 截屏 - * + * * @param screenRect 截屏的矩形区域 * @param outFile 写出到的文件 * @return 写出到的文件 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardListener.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardListener.java index e5ebeed21..663b953f2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardListener.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardListener.java @@ -6,7 +6,7 @@ import java.awt.datatransfer.Transferable; /** * 剪贴板监听事件处理接口
    * 用户通过实现此接口,实现监听剪贴板内容变化 - * + * * @author looly *@since 4.5.6 */ @@ -14,7 +14,7 @@ public interface ClipboardListener { /** * 剪贴板变动触发的事件方法
    * 在此事件中对剪贴板设置值无效,如若修改,需返回修改内容 - * + * * @param clipboard 剪贴板对象 * @param contents 内容 * @return 如果对剪贴板内容做修改,则返回修改的内容,{@code null}表示保留原内容 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java index 508441303..040fecfcb 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java @@ -12,13 +12,13 @@ import java.util.Set; /** * 剪贴板监听 - * + * * @author looly * @since 4.5.6 */ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { INSTANCE; - + /** 默认重试此时:10 */ public static final int DEFAULT_TRY_COUNT = 10; /** 默认重试等待:100 */ @@ -45,7 +45,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 构造 - * + * * @param tryCount 尝试获取剪贴板内容的次数 * @param delay 响应延迟,当从第二次开始,延迟一定毫秒数等待剪贴板可以获取,当tryCount小于2时无效 */ @@ -55,7 +55,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 构造 - * + * * @param tryCount 尝试获取剪贴板内容的次数 * @param delay 响应延迟,当从第二次开始,延迟一定毫秒数等待剪贴板可以获取,当tryCount小于2时无效 * @param clipboard 剪贴板对象 @@ -69,7 +69,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 设置重试次数 - * + * * @param tryCount 重试次数 * @return this */ @@ -80,7 +80,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 设置重试等待 - * + * * @param delay 重试等待 * @return this */ @@ -91,7 +91,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 设置 监听事件处理 - * + * * @param listener 监听事件处理 * @return this */ @@ -102,7 +102,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 去除指定监听 - * + * * @param listener 监听 * @return this */ @@ -113,7 +113,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 清空监听 - * + * * @return this */ public ClipboardMonitor clearListener() { @@ -157,7 +157,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { /** * 开始监听 - * + * * @param sync 是否阻塞 */ public void listen(boolean sync) { @@ -179,7 +179,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { // ------------------------------------------------------------------------------------------------------------------------- Private method start /** * 尝试获取剪贴板内容 - * + * * @param clipboard 剪贴板 * @return 剪贴板内容,{@code null} 表示未获取到 * @throws InterruptedException 线程中断 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardUtil.java index e9cb710ad..0618ff451 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardUtil.java @@ -14,7 +14,7 @@ import cn.hutool.core.exceptions.UtilException; /** * 系统剪贴板工具类 - * + * * @author looly * @since 3.2.0 */ @@ -22,7 +22,7 @@ public class ClipboardUtil { /** * 获取系统剪贴板 - * + * * @return {@link Clipboard} */ public static Clipboard getClipboard() { @@ -31,7 +31,7 @@ public class ClipboardUtil { /** * 设置内容到剪贴板 - * + * * @param contents 内容 */ public static void set(Transferable contents) { @@ -40,7 +40,7 @@ public class ClipboardUtil { /** * 设置内容到剪贴板 - * + * * @param contents 内容 * @param owner 所有者 */ @@ -50,7 +50,7 @@ public class ClipboardUtil { /** * 获取剪贴板内容 - * + * * @param flavor 数据元信息,标识数据类型 * @return 剪贴板内容,类型根据flavor不同而不同 */ @@ -60,7 +60,7 @@ public class ClipboardUtil { /** * 获取剪贴板内容 - * + * * @param content {@link Transferable} * @param flavor 数据元信息,标识数据类型 * @return 剪贴板内容,类型根据flavor不同而不同 @@ -78,7 +78,7 @@ public class ClipboardUtil { /** * 设置字符串文本到剪贴板 - * + * * @param text 字符串文本 */ public static void setStr(String text) { @@ -87,7 +87,7 @@ public class ClipboardUtil { /** * 从剪贴板获取文本 - * + * * @return 文本 */ public static String getStr() { @@ -96,7 +96,7 @@ public class ClipboardUtil { /** * 从剪贴板的{@link Transferable}获取文本 - * + * * @param content {@link Transferable} * @return 文本 * @since 4.5.6 @@ -107,7 +107,7 @@ public class ClipboardUtil { /** * 设置图片到剪贴板 - * + * * @param image 图像 */ public static void setImage(Image image) { @@ -116,7 +116,7 @@ public class ClipboardUtil { /** * 从剪贴板获取图片 - * + * * @return 图片{@link Image} */ public static Image getImage() { @@ -125,7 +125,7 @@ public class ClipboardUtil { /** * 从剪贴板的{@link Transferable}获取图片 - * + * * @param content {@link Transferable} * @return 图片 * @since 4.5.6 @@ -136,7 +136,7 @@ public class ClipboardUtil { /** * 监听剪贴板修改事件 - * + * * @param listener 监听处理接口 * @since 4.5.6 * @see ClipboardMonitor#listen(boolean) @@ -147,7 +147,7 @@ public class ClipboardUtil { /** * 监听剪贴板修改事件 - * + * * @param listener 监听处理接口 * @param sync 是否同步阻塞 * @since 4.5.6 @@ -159,7 +159,7 @@ public class ClipboardUtil { /** * 监听剪贴板修改事件 - * + * * @param tryCount 尝试获取剪贴板内容的次数 * @param delay 响应延迟,当从第二次开始,延迟一定毫秒数等待剪贴板可以获取 * @param listener 监听处理接口 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java index 30d3a33e7..948d278d7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java @@ -9,18 +9,18 @@ import java.io.Serializable; /** * 图片转换器,用于将图片对象转换为剪贴板支持的对象
    * 此对象也用于将图像文件和{@link DataFlavor#imageFlavor} 元信息对应 - * + * * @author looly * @since 4.5.6 */ public class ImageSelection implements Transferable, Serializable { private static final long serialVersionUID = 1L; - + private final Image image; /** * 构造 - * + * * @param image 图片 */ public ImageSelection(Image image) { @@ -29,7 +29,7 @@ public class ImageSelection implements Transferable, Serializable { /** * 获取元数据类型信息 - * + * * @return 元数据类型列表 */ @Override @@ -39,7 +39,7 @@ public class ImageSelection implements Transferable, Serializable { /** * 是否支持指定元数据类型 - * + * * @param flavor 元数据类型 * @return 是否支持 */ @@ -50,7 +50,7 @@ public class ImageSelection implements Transferable, Serializable { /** * 获取图片 - * + * * @param flavor 元数据类型 * @return 转换后的对象 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/StrClipboardListener.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/StrClipboardListener.java index d427d603d..7af403896 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/StrClipboardListener.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/StrClipboardListener.java @@ -7,7 +7,7 @@ import java.io.Serializable; /** * 剪贴板字符串内容监听 - * + * * @author looly * @since 4.5.7 */ @@ -25,7 +25,7 @@ public abstract class StrClipboardListener implements ClipboardListener, Seriali /** * 剪贴板变动触发的事件方法
    * 在此事件中对剪贴板设置值无效,如若修改,需返回修改内容 - * + * * @param clipboard 剪贴板对象 * @param contents 内容 * @return 如果对剪贴板内容做修改,则返回修改的内容,{@code null}表示保留原内容 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/package-info.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/package-info.java index 0a8333297..b7d5e45f4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/package-info.java @@ -1,6 +1,6 @@ /** * 剪贴板相关的工具,包括剪贴板监听等 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/package-info.java b/hutool-core/src/main/java/cn/hutool/core/swing/package-info.java index f37a33272..4f6cb42b8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/package-info.java @@ -1,6 +1,6 @@ /** * Swing和awt相关封装 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/ASCIIStrCache.java b/hutool-core/src/main/java/cn/hutool/core/text/ASCIIStrCache.java index 07e18bb48..fd2b0df29 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/ASCIIStrCache.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/ASCIIStrCache.java @@ -2,13 +2,13 @@ package cn.hutool.core.text; /** * ASCII字符对应的字符串缓存 - * + * * @author looly * @since 4.0.1 * */ public class ASCIIStrCache { - + private static final int ASCII_LENGTH = 128; private static final String[] CACHE = new String[ASCII_LENGTH]; static { @@ -20,7 +20,7 @@ public class ASCIIStrCache { /** * 字符转为字符串
    * 如果为ASCII字符,使用缓存 - * + * * @param c 字符 * @return 字符串 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 8ba12aa52..bf7cea388 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -1628,17 +1628,6 @@ public class CharSequenceUtil { // ------------------------------------------------------------------------ split - /** - * 切分字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @return 切分后的数组 - */ - public static String[] splitToArray(CharSequence str, char separator) { - return splitToArray(str, separator, 0); - } - /** * 切分字符串为long数组 * @@ -1700,6 +1689,33 @@ public class CharSequenceUtil { return split(str, separator, 0); } + /** + * 切分字符串,如果分隔符不存在则返回原字符串 + * + * @param str 被切分的字符串 + * @param separator 分隔符 + * @return 字符串 + * @since 5.6.7 + */ + public static String[] splitToArray(CharSequence str, CharSequence separator) { + if (str == null) { + return new String[]{}; + } + + return StrSpliter.splitToArray(str.toString(), str(separator), 0, false, false); + } + + /** + * 切分字符串 + * + * @param str 被切分的字符串 + * @param separator 分隔符字符 + * @return 切分后的数组 + */ + public static String[] splitToArray(CharSequence str, char separator) { + return splitToArray(str, separator, 0); + } + /** * 切分字符串 * @@ -1809,6 +1825,20 @@ public class CharSequenceUtil { return StrSpliter.split(str.toString(), separator, limit, isTrim, ignoreEmpty); } + /** + * 切分字符串 + * + * @param str 被切分的字符串 + * @param separator 分隔符字符 + * @param isTrim 是否去除切分字符串后每个元素两边的空格 + * @param ignoreEmpty 是否忽略空串 + * @return 切分后的集合 + * @since 5.6.7 + */ + public static List split(CharSequence str, CharSequence separator, boolean isTrim, boolean ignoreEmpty) { + return split(str, separator, 0, isTrim, ignoreEmpty); + } + /** * 切分字符串 * @@ -1834,14 +1864,11 @@ public class CharSequenceUtil { * @param str 被切分的字符串 * @param separator 分隔符 * @return 字符串 + * @deprecated 请使用 {@link #splitToArray(CharSequence, char)} */ + @Deprecated public static String[] split(CharSequence str, CharSequence separator) { - if (str == null) { - return new String[]{}; - } - - final String separatorStr = (null == separator) ? null : separator.toString(); - return StrSpliter.splitToArray(str.toString(), separatorStr, 0, false, false); + return splitToArray(str, separator); } /** @@ -4237,6 +4264,7 @@ public class CharSequenceUtil { /** * 以 conjunction 为分隔符将多个对象转换为字符串 * + * @param 元素类型 * @param conjunction 分隔符 * @param iterable 集合 * @return 连接后的字符串 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java b/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java index c235658b1..d84387af9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java @@ -15,7 +15,7 @@ import java.util.concurrent.locks.StampedLock; * Simhash是一种局部敏感hash,用于海量文本去重。
    * 算法实现来自:https://github.com/xlturing/Simhash4J *

    - * + * *

    * 局部敏感hash定义:假定两个字符串具有一定的相似性,在hash之后,仍然能保持这种相似性,就称之为局部敏感hash。 *

    @@ -31,7 +31,7 @@ public class Simhash { private final int fracBitNum; /** 汉明距离的衡量标准,小于此距离标准表示相似 */ private final int hammingThresh; - + /** 按照分段存储simhash,查找更快速 */ private final List>> storage; private final StampedLock lock = new StampedLock(); @@ -45,7 +45,7 @@ public class Simhash { /** * 构造 - * + * * @param fracCount 存储段数 * @param hammingThresh 汉明距离的衡量标准 */ @@ -121,7 +121,7 @@ public class Simhash { } return false; } - + /** * 按照(frac, 《simhash, content》)索引进行存储 * @@ -131,7 +131,7 @@ public class Simhash { final int fracCount = this.fracCount; final List>> storage = this.storage; final List lFrac = splitSimhash(simhash); - + String frac; Map> fracMap; final long stamp = this.lock.writeLock(); @@ -155,7 +155,7 @@ public class Simhash { //------------------------------------------------------------------------------------------------------ Private method start /** * 计算汉明距离 - * + * * @param s1 值1 * @param s2 值2 * @return 汉明距离 @@ -172,7 +172,7 @@ public class Simhash { /** * 将simhash分成n段 - * + * * @param simhash Simhash值 * @return N段Simhash */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrFormatter.java b/hutool-core/src/main/java/cn/hutool/core/text/StrFormatter.java index 8363d2c88..13374cc63 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrFormatter.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrFormatter.java @@ -5,7 +5,7 @@ import cn.hutool.core.util.StrUtil; /** * 字符串格式化工具 - * + * * @author Looly * */ @@ -19,7 +19,7 @@ public class StrFormatter { * 通常使用:format("this is {} for {}", "a", "b") =》 this is a for b
    * 转义{}: format("this is \\{} for {}", "a", "b") =》 this is \{} for a
    * 转义\: format("this is \\\\{} for {}", "a", "b") =》 this is \a for b
    - * + * * @param strPattern 字符串模板 * @param argArray 参数列表 * @return 结果 @@ -66,7 +66,7 @@ public class StrFormatter { handledPosition = delimIndex + 2; } } - + // append the characters following the last {} pair. // 加入最后一个占位符后所有的字符 sbuf.append(strPattern, handledPosition, strPattern.length()); diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java b/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java index 2be5e8546..0173d1393 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java @@ -12,7 +12,7 @@ import java.util.regex.Pattern; /** * 字符串切分器 - * + *x * @author Looly */ public class StrSpliter { diff --git a/hutool-core/src/main/java/cn/hutool/core/text/TextSimilarity.java b/hutool-core/src/main/java/cn/hutool/core/text/TextSimilarity.java index 548812f1d..b4b271054 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/TextSimilarity.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/TextSimilarity.java @@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil; /** * 文本相似度计算
    * 工具类提供者:【杭州】fineliving - * + * * @author fanqun * @since 3.2.3 **/ @@ -14,7 +14,7 @@ public class TextSimilarity { /** * 计算相似度,两个都是空串相似度为1,被认为是相同的串 - * + * * @param strA 字符串1 * @param strB 字符串2 * @return 相似度 @@ -35,14 +35,14 @@ public class TextSimilarity { // 两个都是空串相似度为1,被认为是相同的串 return 1; } - + int temp2 = longestCommonSubstring(newStrA, newStrB).length(); return NumberUtil.div(temp2, temp); } /** * 计算相似度百分比 - * + * * @param strA 字符串1 * @param strB 字符串2 * @param scale 保留小数 @@ -55,7 +55,7 @@ public class TextSimilarity { // --------------------------------------------------------------------------------------------------- Private method start /** * 将字符串的所有数据依次写成一行,去除无意义字符串 - * + * * @param str 字符串 * @return 处理后的字符串 */ @@ -70,13 +70,13 @@ public class TextSimilarity { sb.append(c); } } - + return sb.toString(); } /** * 判断字符是否为汉字,数字和字母, 因为对符号进行相似度比较没有实际意义,故符号不加入考虑范围。 - * + * * @param charValue 字符 * @return true表示为非汉字,数字和字母,false反之 */ @@ -89,7 +89,7 @@ public class TextSimilarity { /** * 求公共子串,采用动态规划算法。 其不要求所求得的字符在所给的字符串中是连续的。 - * + * * @param strA 字符串1 * @param strB 字符串2 * @return 公共子串 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvConfig.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvConfig.java index ca43cd60e..991ff2614 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvConfig.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvConfig.java @@ -30,27 +30,33 @@ public class CsvConfig implements Serializable { * 设置字段分隔符,默认逗号',' * * @param fieldSeparator 字段分隔符,默认逗号',' + * @return this */ - public void setFieldSeparator(final char fieldSeparator) { + public CsvConfig setFieldSeparator(final char fieldSeparator) { this.fieldSeparator = fieldSeparator; + return this; } /** * 设置 文本分隔符,文本包装符,默认双引号'"' * * @param textDelimiter 文本分隔符,文本包装符,默认双引号'"' + * @return this */ - public void setTextDelimiter(char textDelimiter) { + public CsvConfig setTextDelimiter(char textDelimiter) { this.textDelimiter = textDelimiter; + return this; } /** * 设置 注释符号,用于区分注释行 * * @param commentCharacter 注释符号,用于区分注释行 + * @return this * @since 5.5.7 */ - public void setCommentCharacter(char commentCharacter) { + public CsvConfig setCommentCharacter(char commentCharacter) { this.commentCharacter = commentCharacter; + return this; } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java index e6e23ed42..3bdde7d8d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java @@ -18,7 +18,7 @@ public class CsvData implements Iterable, Serializable { /** * 构造 - * + * * @param header 头信息 * @param rows 行 */ @@ -58,7 +58,7 @@ public class CsvData implements Iterable, Serializable { /** * 获取所有行 - * + * * @return 所有行 */ public List getRows() { diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java index fb84c3af2..897d72d81 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java @@ -4,7 +4,7 @@ import java.io.Serializable; /** * CSV读取配置项 - * + * * @author looly * */ @@ -20,7 +20,7 @@ public class CsvReadConfig extends CsvConfig implements Serializable { /** * 默认配置 - * + * * @return 默认配置 */ public static CsvReadConfig defaultConfig() { @@ -29,28 +29,34 @@ public class CsvReadConfig extends CsvConfig implements Serializable { /** * 设置是否首行做为标题行,默认false - * + * * @param containsHeader 是否首行做为标题行,默认false + * @return this */ - public void setContainsHeader(boolean containsHeader) { + public CsvReadConfig setContainsHeader(boolean containsHeader) { this.containsHeader = containsHeader; + return this; } /** * 设置是否跳过空白行,默认true - * + * * @param skipEmptyRows 是否跳过空白行,默认true + * @return this */ - public void setSkipEmptyRows(boolean skipEmptyRows) { + public CsvReadConfig setSkipEmptyRows(boolean skipEmptyRows) { this.skipEmptyRows = skipEmptyRows; + return this; } /** * 设置每行字段个数不同时是否抛出异常,默认false - * + * * @param errorOnDifferentFieldCount 每行字段个数不同时是否抛出异常,默认false + * @return this */ - public void setErrorOnDifferentFieldCount(boolean errorOnDifferentFieldCount) { + public CsvReadConfig setErrorOnDifferentFieldCount(boolean errorOnDifferentFieldCount) { this.errorOnDifferentFieldCount = errorOnDifferentFieldCount; + return this; } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java index 524bbfeaa..671a09d54 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java @@ -24,7 +24,7 @@ public final class CsvRow implements List { /** * 构造 - * + * * @param originalLineNumber 对应文件中的第几行 * @param headerMap 标题Map * @param fields 数据列表 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java index 7c5e2a72e..75af5948f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java @@ -1,26 +1,29 @@ package cn.hutool.core.text.csv; -import java.io.Serializable; - import cn.hutool.core.util.CharUtil; +import java.io.Serializable; + /** * CSV写出配置项 - * - * @author looly * + * @author looly */ public class CsvWriteConfig extends CsvConfig implements Serializable { private static final long serialVersionUID = 5396453565371560052L; - /** 是否始终使用文本分隔符,文本包装符,默认false,按需添加 */ + /** + * 是否始终使用文本分隔符,文本包装符,默认false,按需添加 + */ protected boolean alwaysDelimitText; - /** 换行符 */ + /** + * 换行符 + */ protected char[] lineDelimiter = {CharUtil.CR, CharUtil.LF}; /** * 默认配置 - * + * * @return 默认配置 */ public static CsvWriteConfig defaultConfig() { @@ -29,19 +32,23 @@ public class CsvWriteConfig extends CsvConfig implements Serializable { /** * 设置是否始终使用文本分隔符,文本包装符,默认false,按需添加 - * + * * @param alwaysDelimitText 是否始终使用文本分隔符,文本包装符,默认false,按需添加 + * @return this */ - public void setAlwaysDelimitText(boolean alwaysDelimitText) { + public CsvWriteConfig setAlwaysDelimitText(boolean alwaysDelimitText) { this.alwaysDelimitText = alwaysDelimitText; + return this; } - + /** * 设置换行符 - * + * * @param lineDelimiter 换行符 + * @return this */ - public void setLineDelimiter(char[] lineDelimiter) { + public CsvWriteConfig setLineDelimiter(char[] lineDelimiter) { this.lineDelimiter = lineDelimiter; + return this; } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/package-info.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/package-info.java index e83158f5e..bc6af864b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/package-info.java @@ -1,6 +1,6 @@ /** * 提供CSV文件读写的封装,入口为CsvUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/escape/Html4Unescape.java b/hutool-core/src/main/java/cn/hutool/core/text/escape/Html4Unescape.java index eeb18eea4..74b37e9bc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/escape/Html4Unescape.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/escape/Html4Unescape.java @@ -5,13 +5,13 @@ import cn.hutool.core.text.replacer.ReplacerChain; /** * HTML4的UNESCAPE - * + * * @author looly * */ public class Html4Unescape extends ReplacerChain { private static final long serialVersionUID = 1L; - + protected static final String[][] BASIC_UNESCAPE = InternalEscapeUtil.invert(Html4Escape.BASIC_ESCAPE); protected static final String[][] ISO8859_1_UNESCAPE = InternalEscapeUtil.invert(Html4Escape.ISO8859_1_ESCAPE); protected static final String[][] HTML40_EXTENDED_UNESCAPE = InternalEscapeUtil.invert(Html4Escape.HTML40_EXTENDED_ESCAPE); diff --git a/hutool-core/src/main/java/cn/hutool/core/text/escape/InternalEscapeUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/escape/InternalEscapeUtil.java index 7020e1b59..d318aef5b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/escape/InternalEscapeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/escape/InternalEscapeUtil.java @@ -9,7 +9,7 @@ class InternalEscapeUtil { /** * 将数组中的0和1位置的值互换,即键值转换 - * + * * @param array String[][] 被转换的数组 * @return String[][] 转换后的数组 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java b/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java index b2270ead8..7a649e78f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java @@ -6,7 +6,7 @@ import cn.hutool.core.util.CharUtil; /** * 形如'的反转义器 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/escape/package-info.java b/hutool-core/src/main/java/cn/hutool/core/text/escape/package-info.java index 0caca7590..fb3e702f8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/escape/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/escape/package-info.java @@ -1,6 +1,6 @@ /** * 提供各种转义和反转义实现 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/package-info.java b/hutool-core/src/main/java/cn/hutool/core/text/package-info.java index 8fa1e6ff0..de673c146 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/package-info.java @@ -1,6 +1,6 @@ /** * 提供文本相关操作的封装,还包括Unicode工具UnicodeUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java b/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java index afccbad25..ac3725a54 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java @@ -9,7 +9,7 @@ import java.util.Set; /** * 查找替换器,通过查找指定关键字,替换对应的值 - * + * * @author looly * @since 4.1.5 */ @@ -23,7 +23,7 @@ public class LookupReplacer extends StrReplacer { /** * 构造 - * + * * @param lookup 被查找的键值对 */ public LookupReplacer(String[]... lookup) { diff --git a/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java b/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java index 368808cda..987bd00cf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java @@ -9,7 +9,7 @@ import java.util.List; /** * 字符串替换链,用于组合多个字符串替换逻辑 - * + * * @author looly * @since 4.1.5 */ @@ -20,7 +20,7 @@ public class ReplacerChain extends StrReplacer implements Chain * 此线程池是一个无限线程池,即加入的线程不等待任何线程,直接执行 - * + * * @author Looly * */ @@ -35,7 +35,7 @@ public class GlobalThreadPool { /** * 关闭公共线程池 - * + * * @param isNow 是否立即关闭而不等待正在执行的线程 */ synchronized public static void shutdown(boolean isNow) { @@ -50,7 +50,7 @@ public class GlobalThreadPool { /** * 获得 {@link ExecutorService} - * + * * @return {@link ExecutorService} */ public static ExecutorService getExecutor() { @@ -59,7 +59,7 @@ public class GlobalThreadPool { /** * 直接在公共线程池中执行线程 - * + * * @param runnable 可运行对象 */ public static void execute(Runnable runnable) { @@ -73,7 +73,7 @@ public class GlobalThreadPool { /** * 执行有返回值的异步方法
    * Future代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞 - * + * * @param 执行的Task * @param task {@link Callable} * @return Future @@ -85,7 +85,7 @@ public class GlobalThreadPool { /** * 执行有返回值的异步方法
    * Future代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞 - * + * * @param runnable 可运行对象 * @return {@link Future} * @since 3.0.5 diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/NamedThreadFactory.java b/hutool-core/src/main/java/cn/hutool/core/thread/NamedThreadFactory.java index 31e0579a1..3f1ea70fc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/NamedThreadFactory.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/NamedThreadFactory.java @@ -8,12 +8,12 @@ import cn.hutool.core.util.StrUtil; /** * 线程创建工厂类,此工厂可选配置: - * + * *
      * 1. 自定义线程命名前缀
      * 2. 自定义是否守护线程
      * 
    - * + * * @author looly * @since 4.0.0 */ @@ -32,17 +32,17 @@ public class NamedThreadFactory implements ThreadFactory { /** * 构造 - * + * * @param prefix 线程名前缀 * @param isDaemon 是否守护线程 */ public NamedThreadFactory(String prefix, boolean isDaemon) { this(prefix, null, isDaemon); } - + /** * 构造 - * + * * @param prefix 线程名前缀 * @param threadGroup 线程组,可以为null * @param isDaemon 是否守护线程 @@ -53,7 +53,7 @@ public class NamedThreadFactory implements ThreadFactory { /** * 构造 - * + * * @param prefix 线程名前缀 * @param threadGroup 线程组,可以为null * @param isDaemon 是否守护线程 @@ -72,7 +72,7 @@ public class NamedThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable r) { final Thread t = new Thread(this.group, r, StrUtil.format("{}{}", prefix, threadNumber.getAndIncrement())); - + //守护线程 if (false == t.isDaemon()) { if (isDaemon) { diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java b/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java index 67a5356a0..dda8d1350 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java @@ -5,10 +5,10 @@ import java.util.concurrent.ThreadPoolExecutor; /** * 线程拒绝策略枚举 - * + * *

    * 如果设置了maxSize, 当总线程数达到上限, 会调用RejectedExecutionHandler进行处理,此枚举为JDK预定义的几种策略枚举表示 - * + * * @author looly * @since 4.1.13 */ @@ -31,7 +31,7 @@ public enum RejectPolicy { /** * 获取RejectedExecutionHandler枚举值 - * + * * @return RejectedExecutionHandler */ public RejectedExecutionHandler getValue() { diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java b/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java index 76131b589..07caca746 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java @@ -4,12 +4,12 @@ import java.util.concurrent.Semaphore; /** * 带有信号量控制的{@link Runnable} 接口抽象实现 - * + * *

    * 通过设置信号量,可以限制可以访问某些资源(物理或逻辑的)线程数目。
    * 例如:设置信号量为2,表示最多有两个线程可以同时执行方法逻辑,其余线程等待,直到此线程逻辑执行完毕 *

    - * + * * @author looly * @since 4.4.5 */ @@ -22,7 +22,7 @@ public class SemaphoreRunnable implements Runnable { /** * 构造 - * + * * @param runnable 实际执行的线程逻辑 * @param semaphore 信号量,多个线程必须共享同一信号量 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadFactoryBuilder.java b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadFactoryBuilder.java index d52c17f53..80d33cb6e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadFactoryBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadFactoryBuilder.java @@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicLong; /** * ThreadFactory创建器
    * 参考:Guava的ThreadFactoryBuilder - * + * * @author looly * @since 4.1.9 */ @@ -31,7 +31,7 @@ public class ThreadFactoryBuilder implements Builder{ /** * 创建{@link ThreadFactoryBuilder} - * + * * @return {@link ThreadFactoryBuilder} */ public static ThreadFactoryBuilder create() { @@ -51,7 +51,7 @@ public class ThreadFactoryBuilder implements Builder{ /** * 设置线程名前缀,例如设置前缀为hutool-thread-,则线程名为hutool-thread-1之类。 - * + * * @param namePrefix 线程名前缀 * @return this */ @@ -62,7 +62,7 @@ public class ThreadFactoryBuilder implements Builder{ /** * 设置是否守护线程 - * + * * @param daemon 是否守护线程 * @return this */ @@ -73,7 +73,7 @@ public class ThreadFactoryBuilder implements Builder{ /** * 设置线程优先级 - * + * * @param priority 优先级 * @return this * @see Thread#MIN_PRIORITY @@ -93,7 +93,7 @@ public class ThreadFactoryBuilder implements Builder{ /** * 设置未捕获异常的处理方式 - * + * * @param uncaughtExceptionHandler {@link UncaughtExceptionHandler} * @return this */ @@ -104,7 +104,7 @@ public class ThreadFactoryBuilder implements Builder{ /** * 构建{@link ThreadFactory} - * + * * @return {@link ThreadFactory} */ @Override @@ -114,7 +114,7 @@ public class ThreadFactoryBuilder implements Builder{ /** * 构建 - * + * * @param builder {@link ThreadFactoryBuilder} * @return {@link ThreadFactory} */ diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java index 599146725..0227ca523 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java @@ -12,6 +12,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; /** * 线程池工具 @@ -366,6 +367,19 @@ public class ThreadUtil { } } + /** + * 创建本地线程对象 + * + * @param 持有对象类型 + * @param supplier 初始化线程对象函数 + * @return 本地线程 + * @see ThreadLocal#withInitial(Supplier) + * @since 5.6.7 + */ + public static ThreadLocal createThreadLocal(Supplier supplier) { + return ThreadLocal.withInitial(supplier); + } + /** * 创建ThreadFactoryBuilder * @@ -562,20 +576,19 @@ public class ThreadUtil { *
  • fixedDelay模式:下一次任务不等待上一次任务,到周期自动执行。
  • * * - * - * @param executor 定时任务线程池,{@code null}新建一个默认线程池 - * @param command 需要定时执行的逻辑 - * @param initialDelay 初始延迟,单位毫秒 - * @param period 执行周期,单位毫秒 + * @param executor 定时任务线程池,{@code null}新建一个默认线程池 + * @param command 需要定时执行的逻辑 + * @param initialDelay 初始延迟,单位毫秒 + * @param period 执行周期,单位毫秒 * @param fixedRateOrFixedDelay {@code true}表示fixedRate模式,{@code false}表示fixedDelay模式 * @return {@link ScheduledThreadPoolExecutor} * @since 5.5.8 */ public static ScheduledThreadPoolExecutor schedule(ScheduledThreadPoolExecutor executor, - Runnable command, - long initialDelay, - long period, - boolean fixedRateOrFixedDelay){ + Runnable command, + long initialDelay, + long period, + boolean fixedRateOrFixedDelay) { return schedule(executor, command, initialDelay, period, TimeUnit.MILLISECONDS, fixedRateOrFixedDelay); } @@ -587,12 +600,11 @@ public class ThreadUtil { *
  • fixedDelay模式:下一次任务不等待上一次任务,到周期自动执行。
  • * * - * - * @param executor 定时任务线程池,{@code null}新建一个默认线程池 - * @param command 需要定时执行的逻辑 - * @param initialDelay 初始延迟 - * @param period 执行周期 - * @param timeUnit 时间单位 + * @param executor 定时任务线程池,{@code null}新建一个默认线程池 + * @param command 需要定时执行的逻辑 + * @param initialDelay 初始延迟 + * @param period 执行周期 + * @param timeUnit 时间单位 * @param fixedRateOrFixedDelay {@code true}表示fixedRate模式,{@code false}表示fixedDelay模式 * @return {@link ScheduledThreadPoolExecutor} * @since 5.6.5 @@ -602,13 +614,13 @@ public class ThreadUtil { long initialDelay, long period, TimeUnit timeUnit, - boolean fixedRateOrFixedDelay){ - if(null == executor){ + boolean fixedRateOrFixedDelay) { + if (null == executor) { executor = createScheduledExecutor(2); } - if(fixedRateOrFixedDelay){ + if (fixedRateOrFixedDelay) { executor.scheduleAtFixedRate(command, initialDelay, period, timeUnit); - } else{ + } else { executor.scheduleWithFixedDelay(command, initialDelay, period, timeUnit); } diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java b/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java index b6c438be2..7ef4b9d46 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java @@ -6,7 +6,7 @@ import java.util.concurrent.locks.Lock; /** * 无锁实现 - * + * * @author looly *@since 4.3.1 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/lock/package-info.java b/hutool-core/src/main/java/cn/hutool/core/thread/lock/package-info.java index 13451546a..d442ffbef 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/lock/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/lock/package-info.java @@ -1,6 +1,6 @@ /** * 锁的实现 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/package-info.java b/hutool-core/src/main/java/cn/hutool/core/thread/package-info.java index 1e11b1720..447309cf5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/package-info.java @@ -1,6 +1,6 @@ /** * 提供线程及高并发封装,入口为ThreadUtil - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedInheritableThreadLocal.java b/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedInheritableThreadLocal.java index f74ee3975..943aa7dd5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedInheritableThreadLocal.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedInheritableThreadLocal.java @@ -13,7 +13,7 @@ public class NamedInheritableThreadLocal extends InheritableThreadLocal { /** * 构造 - * + * * @param name 名字 */ public NamedInheritableThreadLocal(String name) { diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedThreadLocal.java b/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedThreadLocal.java index aa96b712b..babe879f2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedThreadLocal.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/NamedThreadLocal.java @@ -13,7 +13,7 @@ public class NamedThreadLocal extends ThreadLocal { /** * 构造 - * + * * @param name 名字 */ public NamedThreadLocal(String name) { diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/package-info.java b/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/package-info.java index 4f2dceba1..5ca1a0f5f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/threadlocal/package-info.java @@ -1,5 +1,5 @@ /** - * + * * ThreadLocal相关封装 * @author looly * diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 5f052a3af..97abaac63 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -1203,31 +1203,6 @@ public class ArrayUtil extends PrimitiveArrayUtil { return sb.toString(); } - /** - * 以 conjunction 为分隔符将数组转换为字符串 - * - * @param array 数组 - * @param conjunction 分隔符 - * @return 连接后的字符串 - */ - public static String join(long[] array, CharSequence conjunction) { - if (null == array) { - return null; - } - - final StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (long item : array) { - if (isFirst) { - isFirst = false; - } else { - sb.append(conjunction); - } - sb.append(item); - } - return sb.toString(); - } - /** * 以 conjunction 为分隔符将数组转换为字符串 * diff --git a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java index 31024c14b..542f89096 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java @@ -7,7 +7,7 @@ import java.util.Set; /** * Boolean类型相关工具类 - * + * * @author looly * @since 4.1.16 */ @@ -18,7 +18,7 @@ public class BooleanUtil { /** * 取相反值 - * + * * @param bool Boolean值 * @return 相反的Boolean值 */ @@ -63,7 +63,7 @@ public class BooleanUtil { /** * 取相反值 - * + * * @param bool Boolean值 * @return 相反的Boolean值 */ @@ -73,7 +73,7 @@ public class BooleanUtil { /** * 转换字符串为boolean值 - * + * * @param valueStr 字符串 * @return boolean值 */ @@ -87,7 +87,7 @@ public class BooleanUtil { /** * boolean值转为int - * + * * @param value Boolean值 * @return int值 */ @@ -97,7 +97,7 @@ public class BooleanUtil { /** * boolean值转为Integer - * + * * @param value Boolean值 * @return Integer值 */ @@ -107,7 +107,7 @@ public class BooleanUtil { /** * boolean值转为char - * + * * @param value Boolean值 * @return char值 */ @@ -117,7 +117,7 @@ public class BooleanUtil { /** * boolean值转为Character - * + * * @param value Boolean值 * @return Character值 */ @@ -127,7 +127,7 @@ public class BooleanUtil { /** * boolean值转为byte - * + * * @param value Boolean值 * @return byte值 */ @@ -137,7 +137,7 @@ public class BooleanUtil { /** * boolean值转为Byte - * + * * @param value Boolean值 * @return Byte值 */ @@ -147,7 +147,7 @@ public class BooleanUtil { /** * boolean值转为long - * + * * @param value Boolean值 * @return long值 */ @@ -157,7 +157,7 @@ public class BooleanUtil { /** * boolean值转为Long - * + * * @param value Boolean值 * @return Long值 */ @@ -167,7 +167,7 @@ public class BooleanUtil { /** * boolean值转为short - * + * * @param value Boolean值 * @return short值 */ @@ -177,7 +177,7 @@ public class BooleanUtil { /** * boolean值转为Short - * + * * @param value Boolean值 * @return Short值 */ @@ -187,7 +187,7 @@ public class BooleanUtil { /** * boolean值转为float - * + * * @param value Boolean值 * @return float值 */ @@ -197,7 +197,7 @@ public class BooleanUtil { /** * boolean值转为Float - * + * * @param value Boolean值 * @return float值 */ @@ -207,7 +207,7 @@ public class BooleanUtil { /** * boolean值转为double - * + * * @param value Boolean值 * @return double值 */ @@ -217,7 +217,7 @@ public class BooleanUtil { /** * boolean值转为double - * + * * @param value Boolean值 * @return double值 */ @@ -437,7 +437,7 @@ public class BooleanUtil { /** * 给定类是否为Boolean或者boolean - * + * * @param clazz 类 * @return 是否为Boolean或者boolean * @since 4.5.2 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ClassLoaderUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ClassLoaderUtil.java index ce7ec0383..7157980c8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ClassLoaderUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ClassLoaderUtil.java @@ -15,7 +15,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * {@link ClassLoader}工具类 - * + * * @author Looly * @since 3.0.9 */ @@ -57,7 +57,7 @@ public class ClassLoaderUtil { /** * 获取当前线程的{@link ClassLoader} - * + * * @return 当前线程的class loader * @see Thread#getContextClassLoader() */ @@ -68,13 +68,13 @@ public class ClassLoaderUtil { /** * 获取{@link ClassLoader}
    * 获取顺序如下:
    - * + * *
     	 * 1、获取当前线程的ContextClassLoader
     	 * 2、获取当前类对应的ClassLoader
     	 * 3、获取系统ClassLoader({@link ClassLoader#getSystemClassLoader()})
     	 * 
    - * + * * @return 类加载器 */ public static ClassLoader getClassLoader() { @@ -92,13 +92,13 @@ public class ClassLoaderUtil { /** * 加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader并初始化类(调用static模块内容和初始化static属性)
    * 扩展{@link Class#forName(String, boolean, ClassLoader)}方法,支持以下几类类名的加载: - * + * *
     	 * 1、原始类型,例如:int
     	 * 2、数组类型,例如:int[]、Long[]、String[]
     	 * 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
     	 * 
    - * + * * @param name 类名 * @return 类名对应的类 * @throws UtilException 包装{@link ClassNotFoundException},没有类名对应的类时抛出此异常 @@ -110,13 +110,13 @@ public class ClassLoaderUtil { /** * 加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader
    * 扩展{@link Class#forName(String, boolean, ClassLoader)}方法,支持以下几类类名的加载: - * + * *
     	 * 1、原始类型,例如:int
     	 * 2、数组类型,例如:int[]、Long[]、String[]
     	 * 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
     	 * 
    - * + * * @param name 类名 * @param isInitialized 是否初始化类(调用static模块内容和初始化static属性) * @return 类名对应的类 @@ -131,13 +131,13 @@ public class ClassLoaderUtil { * 此方法支持缓存,第一次被加载的类之后会读取缓存中的类
    * 加载失败的原因可能是此类不存在或其关联引用类不存在
    * 扩展{@link Class#forName(String, boolean, ClassLoader)}方法,支持以下几类类名的加载: - * + * *
     	 * 1、原始类型,例如:int
     	 * 2、数组类型,例如:int[]、Long[]、String[]
     	 * 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
     	 * 
    - * + * * @param name 类名 * @param classLoader {@link ClassLoader},{@code null} 则使用系统默认ClassLoader * @param isInitialized 是否初始化类(调用static模块内容和初始化static属性) @@ -193,7 +193,7 @@ public class ClassLoaderUtil { /** * 加载原始类型的类。包括原始类型、原始类型数组和void - * + * * @param name 原始类型名,比如 int * @return 原始类型类 */ @@ -210,7 +210,7 @@ public class ClassLoaderUtil { /** * 创建新的{@link JarClassLoader},并使用此Classloader加载目录下的class文件和jar文件 - * + * * @param jarOrDir jar文件或者包含jar和class文件的目录 * @return {@link JarClassLoader} * @since 4.4.2 @@ -221,7 +221,7 @@ public class ClassLoaderUtil { /** * 加载外部类 - * + * * @param jarOrDir jar文件或者包含jar和class文件的目录 * @param name 类名 * @return 类 @@ -240,7 +240,7 @@ public class ClassLoaderUtil { * 指定类是否被提供,使用默认ClassLoader
    * 通过调用{@link #loadClass(String, ClassLoader, boolean)}方法尝试加载指定类名的类,如果加载失败返回false
    * 加载失败的原因可能是此类不存在或其关联引用类不存在 - * + * * @param className 类名 * @return 是否被提供 */ @@ -252,7 +252,7 @@ public class ClassLoaderUtil { * 指定类是否被提供
    * 通过调用{@link #loadClass(String, ClassLoader, boolean)}方法尝试加载指定类名的类,如果加载失败返回false
    * 加载失败的原因可能是此类不存在或其关联引用类不存在 - * + * * @param className 类名 * @param classLoader {@link ClassLoader} * @return 是否被提供 @@ -269,7 +269,7 @@ public class ClassLoaderUtil { // ----------------------------------------------------------------------------------- Private method start /** * 尝试转换并加载内部类,例如java.lang.Thread.State =》java.lang.Thread$State - * + * * @param name 类名 * @param classLoader {@link ClassLoader},{@code null} 则使用系统默认ClassLoader * @param isInitialized 是否初始化类(调用static模块内容和初始化static属性) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java index f5499f46f..d81712988 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java @@ -387,7 +387,6 @@ public class IdcardUtil { // 首字母A-Z,A表示1,以此类推 char start = idcard.charAt(0); - int iStart = start - 'A' + 1; String mid = card.substring(1, 7); String end = card.substring(7, 8); char[] chars = mid.toCharArray(); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index 9f68a82fc..65bb2fafe 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -356,11 +356,11 @@ public class ObjectUtil { * 如果给定对象为{@code null}或者""或者空白符返回默认值 * *
    -	 * ObjectUtil.defaultIfEmpty(null, null)      = null
    -	 * ObjectUtil.defaultIfEmpty(null, "")        = ""
    -	 * ObjectUtil.defaultIfEmpty("", "zz")      = "zz"
    -	 * ObjectUtil.defaultIfEmpty(" ", "zz")      = "zz"
    -	 * ObjectUtil.defaultIfEmpty("abc", *)        = "abc"
    +	 * ObjectUtil.defaultIfBlank(null, null)      = null
    +	 * ObjectUtil.defaultIfBlank(null, "")        = ""
    +	 * ObjectUtil.defaultIfBlank("", "zz")      = "zz"
    +	 * ObjectUtil.defaultIfBlank(" ", "zz")      = "zz"
    +	 * ObjectUtil.defaultIfBlank("abc", *)        = "abc"
     	 * 
    * * @param 对象类型(必须实现CharSequence接口) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java index f554679ac..b05737150 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java @@ -1613,6 +1613,31 @@ public class PrimitiveArrayUtil { return sb.toString(); } + /** + * 以 conjunction 为分隔符将数组转换为字符串 + * + * @param array 数组 + * @param conjunction 分隔符 + * @return 连接后的字符串 + */ + public static String join(long[] array, CharSequence conjunction) { + if (null == array) { + return null; + } + + final StringBuilder sb = new StringBuilder(); + boolean isFirst = true; + for (long item : array) { + if (isFirst) { + isFirst = false; + } else { + sb.append(conjunction); + } + sb.append(item); + } + return sb.toString(); + } + /** * 以 conjunction 为分隔符将数组转换为字符串 * @@ -2038,7 +2063,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - long tmp; while (j > i) { swap(array, i, j); j--; @@ -2073,7 +2097,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - int tmp; while (j > i) { swap(array, i, j); j--; @@ -2108,7 +2131,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - short tmp; while (j > i) { swap(array, i, j); j--; @@ -2143,7 +2165,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - char tmp; while (j > i) { swap(array, i, j); j--; @@ -2178,7 +2199,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - byte tmp; while (j > i) { swap(array, i, j); j--; @@ -2213,7 +2233,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - double tmp; while (j > i) { swap(array, i, j); j--; @@ -2248,7 +2267,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - float tmp; while (j > i) { swap(array, i, j); j--; @@ -2283,7 +2301,6 @@ public class PrimitiveArrayUtil { } int i = Math.max(startIndexInclusive, 0); int j = Math.min(array.length, endIndexExclusive) - 1; - boolean tmp; while (j > i) { swap(array, i, j); j--; diff --git a/hutool-core/src/main/java/cn/hutool/core/util/RadixUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/RadixUtil.java index 2d5278f41..ddf01bacb 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/RadixUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/RadixUtil.java @@ -54,8 +54,7 @@ public class RadixUtil { public static String encode(final String radixs, final int num) { //考虑到负数问题 long tmpNum = (num >= 0 ? num : (0x100000000L - (~num + 1))); - - return encode(radixs, num, 32); + return encode(radixs, tmpNum, 32); } /** @@ -73,7 +72,7 @@ public class RadixUtil { return encode(radixs, num, 64); } - private static String encode(final String radixs, final long num, int maxLength) { + private static String encode(final String radixs, long num, int maxLength) { if (radixs.length() < 2) { throw new RuntimeException("自定义进制最少两个字符哦!"); } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java index a8ff4b900..5ba9b8e76 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java @@ -14,15 +14,15 @@ import java.lang.ref.WeakReference; * 2. {@link WeakReference} 弱引用,在GC时发现弱引用会回收其对象 * 3. {@link PhantomReference} 虚引用,在GC时发现虚引用对象,会将{@link PhantomReference}插入{@link ReferenceQueue}。 此时对象未被真正回收,要等到{@link ReferenceQueue}被真正处理后才会被回收。 * - * + * * @author looly * @since 3.1.2 */ public class ReferenceUtil { - + /** * 获得引用 - * + * * @param 被引用对象类型 * @param type 引用类型枚举 * @param referent 被引用对象 @@ -34,7 +34,7 @@ public class ReferenceUtil { /** * 获得引用 - * + * * @param 被引用对象类型 * @param type 引用类型枚举 * @param referent 被引用对象 @@ -56,7 +56,7 @@ public class ReferenceUtil { /** * 引用类型 - * + * * @author looly * */ diff --git a/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java index 1d417ad36..4cedf7426 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java @@ -2,6 +2,7 @@ package cn.hutool.core.util; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.StrBuilder; import java.io.File; import java.io.IOException; @@ -9,6 +10,7 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; +import java.util.Stack; /** * 系统运行时工具类,用于执行系统命令的工具 @@ -74,22 +76,9 @@ public class RuntimeUtil { * @return {@link Process} */ public static Process exec(String... cmds) { - if (ArrayUtil.isEmpty(cmds)) { - throw new NullPointerException("Command is empty !"); - } - - // 单条命令的情况 - if (1 == cmds.length) { - final String cmd = cmds[0]; - if (StrUtil.isBlank(cmd)) { - throw new NullPointerException("Command is empty !"); - } - cmds = StrUtil.splitToArray(cmd, StrUtil.C_SPACE); - } - Process process; try { - process = new ProcessBuilder(cmds).redirectErrorStream(true).start(); + process = new ProcessBuilder(handleCmds(cmds)).redirectErrorStream(true).start(); } catch (IOException e) { throw new IORuntimeException(e); } @@ -120,20 +109,8 @@ public class RuntimeUtil { * @since 4.1.6 */ public static Process exec(String[] envp, File dir, String... cmds) { - if (ArrayUtil.isEmpty(cmds)) { - throw new NullPointerException("Command is empty !"); - } - - // 单条命令的情况 - if (1 == cmds.length) { - final String cmd = cmds[0]; - if (StrUtil.isBlank(cmd)) { - throw new NullPointerException("Command is empty !"); - } - cmds = StrUtil.splitToArray(cmd, StrUtil.C_SPACE); - } try { - return Runtime.getRuntime().exec(cmds, envp, dir); + return Runtime.getRuntime().exec(handleCmds(cmds), envp, dir); } catch (IOException e) { throw new IORuntimeException(e); } @@ -301,4 +278,80 @@ public class RuntimeUtil { public static long getUsableMemory() { return getMaxMemory() - getTotalMemory() + getFreeMemory(); } + + /** + * 处理命令,多行命令原样返回,单行命令拆分处理 + * @param cmds 命令 + * @return 处理后的命令 + */ + private static String[] handleCmds(String... cmds){ + if (ArrayUtil.isEmpty(cmds)) { + throw new NullPointerException("Command is empty !"); + } + + // 单条命令的情况 + if (1 == cmds.length) { + final String cmd = cmds[0]; + if (StrUtil.isBlank(cmd)) { + throw new NullPointerException("Command is blank !"); + } + cmds = cmdSplit(cmd); + } + return cmds; + } + + /** + * 命令分割,使用空格分割,考虑双引号和单引号的情况 + * + * @param cmd 命令,如 git commit -m 'test commit' + * @return 分割后的命令 + */ + private static String[] cmdSplit(String cmd){ + final List cmds = new ArrayList<>(); + + final int length = cmd.length(); + final Stack stack = new Stack<>(); + boolean inWrap = false; + final StrBuilder cache = StrUtil.strBuilder(); + + char c; + for (int i = 0; i < length; i++) { + c = cmd.charAt(i); + switch (c){ + case CharUtil.SINGLE_QUOTE: + case CharUtil.DOUBLE_QUOTES: + if(inWrap){ + if(c == stack.peek()){ + //结束包装 + stack.pop(); + inWrap = false; + } + cache.append(c); + } else{ + stack.push(c); + cache.append(c); + inWrap = true; + } + break; + case CharUtil.SPACE: + if(inWrap){ + // 处于包装内 + cache.append(c); + } else{ + cmds.add(cache.toString()); + cache.reset(); + } + break; + default: + cache.append(c); + break; + } + } + + if(cache.hasContent()){ + cmds.add(cache.toString()); + } + + return cmds.toArray(new String[0]); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java index 85515d20d..659484535 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java @@ -1508,7 +1508,7 @@ public class XmlUtil { */ @Override public String getNamespaceURI(String prefix) { - if (prefix == null || prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) { + if (prefix == null || XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) { return prefixUri.get(DEFAULT_NS); } else { return prefixUri.get(prefix); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java index 1e7537065..d9851403f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java @@ -660,7 +660,6 @@ public class ZipUtil { public static void read(ZipInputStream zipStream, Consumer consumer) { try { ZipEntry zipEntry; - File outItemFile; while (null != (zipEntry = zipStream.getNextEntry())) { consumer.accept(zipEntry); } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/package-info.java b/hutool-core/src/main/java/cn/hutool/core/util/package-info.java index ff2428af5..02329123a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/package-info.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/package-info.java @@ -1,6 +1,6 @@ /** * 提供各种工具方法,按照归类入口为XXXUtil,如字符串工具StrUtil等 - * + * * @author looly * */ diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java index 72ab88427..6b41de3ad 100644 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java @@ -8,7 +8,7 @@ import java.lang.annotation.Target; /** * 用于单元测试的注解类
    * 注解类相关说明见:https://www.cnblogs.com/xdp-gacl/p/3622275.html - * + * * @author looly * */ @@ -17,10 +17,10 @@ import java.lang.annotation.Target; // Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分 @Target({ ElementType.METHOD, ElementType.TYPE }) public @interface AnnotationForTest { - + /** * 注解的默认属性值 - * + * * @return 属性值 */ String value(); diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java index 600fcb94e..4b323f48c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java @@ -14,7 +14,7 @@ import cn.hutool.core.lang.test.bean.UserInfoDict; /** * {@link BeanPath} 单元测试 - * + * * @author looly * */ @@ -66,7 +66,7 @@ public class BeanPathTest { Assert.assertEquals("id", pattern.patternParts.get(3)); } - + @Test public void beanPathTest2() { BeanPath pattern = new BeanPath("[userInfo][examInfoDict][0][id]"); @@ -75,7 +75,7 @@ public class BeanPathTest { Assert.assertEquals("0", pattern.patternParts.get(2)); Assert.assertEquals("id", pattern.patternParts.get(3)); } - + @Test public void beanPathTest3() { BeanPath pattern = new BeanPath("['userInfo']['examInfoDict'][0]['id']"); diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index 3e39d6c8c..eaaa9259a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -164,7 +164,7 @@ public class BeanUtilTest { public void mapToBeanWinErrorTest() { Map map = new HashMap<>(); map.put("age", "哈哈"); - Person user = BeanUtil.toBean(map, Person.class); + BeanUtil.toBean(map, Person.class); } @Test @@ -559,7 +559,6 @@ public class BeanUtilTest { @Test public void toMapTest() { // 测试转map的时候返回key - String name = null; PrivilegeIClassification a = new PrivilegeIClassification(); a.setId("1"); a.setName("2"); diff --git a/hutool-core/src/test/java/cn/hutool/core/clone/CloneTest.java b/hutool-core/src/test/java/cn/hutool/core/clone/CloneTest.java index fadb453b7..fe1f12ef2 100644 --- a/hutool-core/src/test/java/cn/hutool/core/clone/CloneTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/clone/CloneTest.java @@ -11,10 +11,10 @@ import org.junit.Test; * */ public class CloneTest { - + @Test public void cloneTest(){ - + //实现Cloneable接口 Cat cat = new Cat(); Cat cat2 = cat.clone(); @@ -28,7 +28,7 @@ public class CloneTest { Dog dog2 = dog.clone(); Assert.assertEquals(dog, dog2); } - + //------------------------------------------------------------------------------- private Class for test /** * 猫猫类,使用实现Cloneable方式 @@ -39,7 +39,7 @@ public class CloneTest { static class Cat implements Cloneable{ private String name = "miaomiao"; private int age = 2; - + @Override public Cat clone() { try { @@ -49,7 +49,7 @@ public class CloneTest { } } } - + /** * 狗狗类,用于继承CloneSupport类 * @author Looly diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/BCDTest.java b/hutool-core/src/test/java/cn/hutool/core/codec/BCDTest.java index 0678887f4..46c99a853 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/BCDTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/BCDTest.java @@ -4,11 +4,11 @@ import org.junit.Assert; import org.junit.Test; public class BCDTest { - + @Test public void bcdTest(){ String strForTest = "123456ABCDEF"; - + //转BCD byte[] bcd = BCD.strToBcd(strForTest); String str = BCD.bcdToStr(bcd); diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/Base32Test.java b/hutool-core/src/test/java/cn/hutool/core/codec/Base32Test.java index dcea562e8..76313f085 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/Base32Test.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/Base32Test.java @@ -4,13 +4,13 @@ import org.junit.Assert; import org.junit.Test; public class Base32Test { - + @Test public void encodeAndDecodeTest(){ String a = "伦家是一个非常长的字符串"; String encode = Base32.encode(a); Assert.assertEquals("4S6KNZNOW3TJRL7EXCAOJOFK5GOZ5ZNYXDUZLP7HTKCOLLMX46WKNZFYWI", encode); - + String decodeStr = Base32.decodeStr(encode); Assert.assertEquals(a, decodeStr); } diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/Base62Test.java b/hutool-core/src/test/java/cn/hutool/core/codec/Base62Test.java index 988e8ce34..dc528e7af 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/Base62Test.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/Base62Test.java @@ -5,7 +5,7 @@ import org.junit.Test; /** * Base62单元测试 - * + * * @author looly * */ diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/Base64Test.java b/hutool-core/src/test/java/cn/hutool/core/codec/Base64Test.java index b3ba9f123..fa42ec7db 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/Base64Test.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/Base64Test.java @@ -7,18 +7,28 @@ import org.junit.Test; /** * Base64单元测试 - * + * * @author looly * */ public class Base64Test { - + @Test public void encodeAndDecodeTest() { String a = "伦家是一个非常长的字符串66"; String encode = Base64.encode(a); Assert.assertEquals("5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5LiyNjY=", encode); - + + String decodeStr = Base64.decodeStr(encode); + Assert.assertEquals(a, decodeStr); + } + + @Test + public void encodeAndDecodeWithoutPaddingTest() { + String a = "伦家是一个非常长的字符串66"; + String encode = Base64.encodeWithoutPadding(StrUtil.utf8Bytes(a)); + Assert.assertEquals("5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5LiyNjY", encode); + String decodeStr = Base64.decodeStr(encode); Assert.assertEquals(a, decodeStr); } @@ -28,7 +38,7 @@ public class Base64Test { String a = "a61a5db5a67c01445ca2-HZ20181120172058/pdf/中国电信影像云单体网关Docker版-V1.2.pdf"; String encode = Base64.encode(a, CharsetUtil.UTF_8); Assert.assertEquals("YTYxYTVkYjVhNjdjMDE0NDVjYTItSFoyMDE4MTEyMDE3MjA1OC9wZGYv5Lit5Zu955S15L+h5b2x5YOP5LqR5Y2V5L2T572R5YWzRG9ja2Vy54mILVYxLjIucGRm", encode); - + String decodeStr = Base64.decodeStr(encode, CharsetUtil.UTF_8); Assert.assertEquals(a, decodeStr); } @@ -42,7 +52,7 @@ public class Base64Test { String decodeStr = Base64.decodeStr(encode); Assert.assertEquals(a, decodeStr); } - + @Test public void urlSafeEncodeAndDecodeTest() { String a = "广州伦家需要安全感55"; diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/CaesarTest.java b/hutool-core/src/test/java/cn/hutool/core/codec/CaesarTest.java index e55a2aa58..86d6c6894 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/CaesarTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/CaesarTest.java @@ -4,7 +4,7 @@ import org.junit.Assert; import org.junit.Test; public class CaesarTest { - + @Test public void caesarTest() { String str = "1f2e9df6131b480b9fdddc633cf24996"; diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/MorseTest.java b/hutool-core/src/test/java/cn/hutool/core/codec/MorseTest.java index 2ceda0d33..5b78bd98a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/MorseTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/MorseTest.java @@ -4,7 +4,7 @@ import org.junit.Assert; import org.junit.Test; public class MorseTest { - + private final Morse morseCoder = new Morse(); @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/RotTest.java b/hutool-core/src/test/java/cn/hutool/core/codec/RotTest.java index 2a4bfb722..f3f90172d 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/RotTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/RotTest.java @@ -4,14 +4,14 @@ import org.junit.Assert; import org.junit.Test; public class RotTest { - + @Test public void rot13Test() { String str = "1f2e9df6131b480b9fdddc633cf24996"; - + String encode13 = Rot.encode13(str); Assert.assertEquals("4s5r2qs9464o713o2sqqqp966ps57229", encode13); - + String decode13 = Rot.decode13(encode13); Assert.assertEquals(str, decode13); } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java index 446716cb3..5b9ac9619 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java @@ -102,7 +102,7 @@ public class CollUtilTest { Collection union = CollUtil.union(list1, list2); - Assert.assertEquals(3, CollUtil.count(union, t -> t.equals("b"))); + Assert.assertEquals(3, CollUtil.count(union, t -> "b".equals(t))); } @Test @@ -111,7 +111,7 @@ public class CollUtilTest { ArrayList list2 = CollUtil.newArrayList("a", "b", "b", "b", "c", "d"); Collection intersection = CollUtil.intersection(list1, list2); - Assert.assertEquals(2, CollUtil.count(intersection, t -> t.equals("b"))); + Assert.assertEquals(2, CollUtil.count(intersection, t -> "b".equals(t))); } @Test @@ -236,7 +236,7 @@ public class CollUtilTest { final String[] result = new String[1]; CollUtil.forEach(map, (key, value, index) -> { - if (key.equals("a")) { + if ("a".equals(key)) { result[0] = value; } }); diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java index 88de58ff5..613212049 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java @@ -11,7 +11,7 @@ import java.util.*; * */ public class IterUtilTest { - + @Test public void fieldValueMapTest() { ArrayList carList = CollUtil.newArrayList(new Car("123", "大众"), new Car("345", "奔驰"), new Car("567", "路虎")); @@ -27,11 +27,11 @@ public class IterUtilTest { ArrayList list = CollUtil.newArrayList("1", "2", "3", "4"); String join = IterUtil.join(list.iterator(), ":"); Assert.assertEquals("1:2:3:4", join); - + ArrayList list1 = CollUtil.newArrayList(1, 2, 3, 4); String join1 = IterUtil.join(list1.iterator(), ":"); Assert.assertEquals("1:2:3:4", join1); - + ArrayList list2 = CollUtil.newArrayList("1", "2", "3", "4"); String join2 = IterUtil.join(list2.iterator(), ":", "\"", "\""); Assert.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2); diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/MapProxyTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/MapProxyTest.java index 6355011e9..c216a61f0 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/MapProxyTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/MapProxyTest.java @@ -11,20 +11,20 @@ import org.junit.Test; import cn.hutool.core.map.MapProxy; public class MapProxyTest { - + @Test public void mapProxyTest() { Map map = new HashMap<>(); map.put("a", "1"); map.put("b", "2"); - + MapProxy mapProxy = new MapProxy(map); Integer b = mapProxy.getInt("b"); Assert.assertEquals(new Integer(2), b); - + Set keys = mapProxy.keySet(); Assert.assertFalse(keys.isEmpty()); - + Set> entrys = mapProxy.entrySet(); Assert.assertFalse(entrys.isEmpty()); } diff --git a/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java b/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java index 7d89e19f9..470735acc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/comparator/VersionComparatorTest.java @@ -5,42 +5,42 @@ import org.junit.Test; /** * 版本比较单元测试 - * + * * @author looly * */ public class VersionComparatorTest { - + @Test public void versionComparatorTest1() { int compare = VersionComparator.INSTANCE.compare("1.2.1", "1.12.1"); Assert.assertTrue(compare < 0); } - + @Test public void versionComparatorTest2() { int compare = VersionComparator.INSTANCE.compare("1.12.1", "1.12.1c"); Assert.assertTrue(compare < 0); } - + @Test public void versionComparatorTest3() { int compare = VersionComparator.INSTANCE.compare(null, "1.12.1c"); Assert.assertTrue(compare < 0); } - + @Test public void versionComparatorTest4() { int compare = VersionComparator.INSTANCE.compare("1.13.0", "1.12.1c"); Assert.assertTrue(compare > 0); } - + @Test public void versionComparatorTest5() { int compare = VersionComparator.INSTANCE.compare("V1.2", "V1.1"); Assert.assertTrue(compare > 0); } - + @Test public void versionComparatorTes6() { int compare = VersionComparator.INSTANCE.compare("V0.0.20170102", "V0.0.20170101"); diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertOtherTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertOtherTest.java index 947b87455..214e0485f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertOtherTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertOtherTest.java @@ -63,11 +63,11 @@ public class ConvertOtherTest { double a = 67556.32; String digitUppercase = Convert.digitToChinese(a); Assert.assertEquals("陆万柒仟伍佰伍拾陆元叁角贰分", digitUppercase); - + a = 1024.00; digitUppercase = Convert.digitToChinese(a); Assert.assertEquals("壹仟零贰拾肆元整", digitUppercase); - + a = 1024; digitUppercase = Convert.digitToChinese(a); Assert.assertEquals("壹仟零贰拾肆元整", digitUppercase); diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToArrayTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToArrayTest.java index faca665f8..8c92b5bd2 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToArrayTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToArrayTest.java @@ -14,7 +14,7 @@ import java.util.ArrayList; /** * 类型转换工具单元测试
    * 转换为数组 - * + * * @author Looly * */ @@ -23,13 +23,13 @@ public class ConvertToArrayTest { @Test public void toIntArrayTest() { String[] b = { "1", "2", "3", "4" }; - + Integer[] integerArray = Convert.toIntArray(b); Assert.assertArrayEquals(integerArray, new Integer[]{1,2,3,4}); - + int[] intArray = Convert.convert(int[].class, b); Assert.assertArrayEquals(intArray, new int[]{1,2,3,4}); - + long[] c = {1,2,3,4,5}; Integer[] intArray2 = Convert.toIntArray(c); Assert.assertArrayEquals(intArray2, new Integer[]{1,2,3,4,5}); @@ -43,49 +43,49 @@ public class ConvertToArrayTest { Integer[] integerArray = (Integer[]) arrayConverter.convert(b, null); Assert.assertArrayEquals(integerArray, new Integer[]{null, 1}); } - + @Test public void toLongArrayTest() { String[] b = { "1", "2", "3", "4" }; - + Long[] longArray = Convert.toLongArray(b); Assert.assertArrayEquals(longArray, new Long[]{1L,2L,3L,4L}); - + long[] longArray2 = Convert.convert(long[].class, b); Assert.assertArrayEquals(longArray2, new long[]{1L,2L,3L,4L}); - + int[] c = {1,2,3,4,5}; Long[] intArray2 = Convert.toLongArray(c); Assert.assertArrayEquals(intArray2, new Long[]{1L,2L,3L,4L,5L}); } - + @Test public void toDoubleArrayTest() { String[] b = { "1", "2", "3", "4" }; - + Double[] doubleArray = Convert.toDoubleArray(b); Assert.assertArrayEquals(doubleArray, new Double[]{1D,2D,3D,4D}); - + double[] doubleArray2 = Convert.convert(double[].class, b); Assert.assertArrayEquals(doubleArray2, new double[]{1D,2D,3D,4D}, 2); - + int[] c = {1,2,3,4,5}; Double[] intArray2 = Convert.toDoubleArray(c); Assert.assertArrayEquals(intArray2, new Double[]{1D,2D,3D,4D,5D}); } - + @Test public void toPrimitiveArrayTest(){ - + //数组转数组测试 int[] a = new int[]{1,2,3,4}; long[] result = ConverterRegistry.getInstance().convert(long[].class, a); Assert.assertArrayEquals(new long[]{1L, 2L, 3L, 4L}, result); - + //数组转数组测试 byte[] resultBytes = ConverterRegistry.getInstance().convert(byte[].class, a); Assert.assertArrayEquals(new byte[]{1, 2, 3, 4}, resultBytes); - + //字符串转数组 String arrayStr = "1,2,3,4,5"; //获取Converter类的方法2,自己实例化相应Converter对象 @@ -93,32 +93,32 @@ public class ConvertToArrayTest { int[] result3 = (int[]) c3.convert(arrayStr, null); Assert.assertArrayEquals(new int[]{1,2,3,4,5}, result3); } - + @Test public void collectionToArrayTest() { ArrayList list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); - + String[] result = Convert.toStrArray(list); Assert.assertEquals(list.get(0), result[0]); Assert.assertEquals(list.get(1), result[1]); Assert.assertEquals(list.get(2), result[2]); } - + @Test public void strToCharArrayTest() { String testStr = "abcde"; Character[] array = Convert.toCharArray(testStr); - + //包装类型数组 Assert.assertEquals(new Character('a'), array[0]); Assert.assertEquals(new Character('b'), array[1]); Assert.assertEquals(new Character('c'), array[2]); Assert.assertEquals(new Character('d'), array[3]); Assert.assertEquals(new Character('e'), array[4]); - + //原始类型数组 char[] array2 = Convert.convert(char[].class, testStr); Assert.assertEquals('a', array2[0]); @@ -126,16 +126,16 @@ public class ConvertToArrayTest { Assert.assertEquals('c', array2[2]); Assert.assertEquals('d', array2[3]); Assert.assertEquals('e', array2[4]); - + } - + @Test @Ignore public void toUrlArrayTest() { File[] files = FileUtil.file("D:\\workspace").listFiles(); - + URL[] urls = Convert.convert(URL[].class, files); - + for (URL url : urls) { Console.log(url.getPath()); } diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToBeanTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToBeanTest.java index 4617710c5..8ab5b15ff 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToBeanTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToBeanTest.java @@ -12,7 +12,7 @@ import java.util.Map; /** * 类型转换工具单元测试
    * 转换为数组 - * + * * @author Looly * */ @@ -25,7 +25,7 @@ public class ConvertToBeanTest { person.setOpenid("11213232"); person.setName("测试A11"); person.setSubName("sub名字"); - + Map map = Convert.convert(Map.class, person); Assert.assertEquals(map.get("name"), "测试A11"); Assert.assertEquals(map.get("age"), 14); @@ -67,7 +67,7 @@ public class ConvertToBeanTest { Assert.assertEquals("3", map2.get("key3")); Assert.assertEquals("4", map2.get("key4")); } - + @Test public void mapToBeanTest() { HashMap map = new HashMap<>(); @@ -76,7 +76,7 @@ public class ConvertToBeanTest { map.put("openid", "11213232"); map.put("name", "测试A11"); map.put("subName", "sub名字"); - + SubPerson subPerson = Convert.convert(SubPerson.class, map); Assert.assertEquals("88dc4b28-91b1-4a1a-bab5-444b795c7ecd", subPerson.getId().toString()); Assert.assertEquals(14, subPerson.getAge()); diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java index c3c1de25b..0f51ad24f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java @@ -14,7 +14,7 @@ import java.util.List; /** * 转换为集合测试 - * + * * @author looly * */ @@ -41,7 +41,7 @@ public class ConvertToCollectionTest { Assert.assertEquals("", list.get(3)); Assert.assertEquals(1, list.get(4)); } - + @Test public void toListTest2() { Object[] a = { "a", "你", "好", "", 1 }; @@ -52,7 +52,7 @@ public class ConvertToCollectionTest { Assert.assertEquals("", list.get(3)); Assert.assertEquals("1", list.get(4)); } - + @Test public void toListTest3() { Object[] a = { "a", "你", "好", "", 1 }; @@ -63,7 +63,7 @@ public class ConvertToCollectionTest { Assert.assertEquals("", list.get(3)); Assert.assertEquals("1", list.get(4)); } - + @Test public void toListTest4() { Object[] a = { "a", "你", "好", "", 1 }; @@ -90,7 +90,7 @@ public class ConvertToCollectionTest { Assert.assertEquals(1, list2.size()); Assert.assertEquals("a", list2.get(0)); } - + @Test public void strToListTest2() { String a = "a,你,好,123"; diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 53f629461..6a8e29c02 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -3,7 +3,6 @@ package cn.hutool.core.date; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.BetweenFormatter.Level; import cn.hutool.core.date.format.FastDateFormat; -import cn.hutool.core.lang.Console; import cn.hutool.core.util.RandomUtil; import org.junit.Assert; import org.junit.Test; diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java index afc0e9117..7cd4930cb 100644 --- a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java @@ -13,6 +13,8 @@ import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; public class ImgUtilTest { @@ -47,7 +49,7 @@ public class ImgUtilTest { public void cutTest() { ImgUtil.cut(FileUtil.file("d:/face.jpg"), FileUtil.file("d:/face_result.jpg"), new Rectangle(200, 200, 100, 100)); } - + @Test @Ignore public void rotateTest() throws IOException { @@ -88,27 +90,27 @@ public class ImgUtilTest { public void sliceByRowsAndColsTest() { ImgUtil.sliceByRowsAndCols(FileUtil.file("d:/test/logo.jpg"), FileUtil.file("d:/test/dest"), 1, 5); } - + @Test @Ignore public void convertTest() { ImgUtil.convert(FileUtil.file("e:/test2.png"), FileUtil.file("e:/test2Convert.jpg")); } - + @Test @Ignore public void writeTest() { final byte[] bytes = ImgUtil.toBytes(ImgUtil.read("d:/test/logo_484.png"), "png"); FileUtil.writeBytes(bytes, "d:/test/result.png"); } - + @Test @Ignore public void compressTest() { ImgUtil.compress(FileUtil.file("d:/test/dest.png"), FileUtil.file("d:/test/1111_target.jpg"), 0.1f); } - + @Test @Ignore public void copyTest() { @@ -136,4 +138,11 @@ public class ImgUtilTest { new File("d:/test/3.jpg"), new Color(200, 0, 0), 10); } + + @Test + public void getMainColor() throws MalformedURLException { + BufferedImage read = ImgUtil.read(new URL("https://pic2.zhimg.com/v2-94f5552f2b142ff575306850c5bab65d_b.png")); + String mainColor = ImgUtil.getMainColor(read, new int[]{64,84,116}); + System.out.println(mainColor); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java index a977451a8..6202224bb 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java @@ -18,8 +18,8 @@ public class TreeTest { static { // 模拟数据 nodeList.add(new TreeNode<>("1", "0", "系统管理", 5)); - nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222)); nodeList.add(new TreeNode<>("111", "11", "用户添加", 0)); + nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222)); nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1)); nodeList.add(new TreeNode<>("21", "2", "商品管理", 44)); @@ -33,6 +33,7 @@ public class TreeTest { for (Tree tree : treeList) { Assert.assertNotNull(tree); Assert.assertEquals("0", tree.getParentId()); +// Console.log(tree); } // 测试通过子节点查找父节点 diff --git a/hutool-core/src/test/java/cn/hutool/core/stream/StreamUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/stream/StreamUtilTest.java new file mode 100644 index 000000000..a38d8ff26 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/stream/StreamUtilTest.java @@ -0,0 +1,16 @@ +package cn.hutool.core.stream; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.stream.Stream; + +public class StreamUtilTest { + + @Test + public void ofTest(){ + final Stream stream = StreamUtil.of(2, x -> x * 2, 4); + final String result = stream.collect(CollectorUtil.joining(",")); + Assert.assertEquals("2,4,8,16", result); + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java index 1d10ef5f5..8a579ff5f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Map; public class CsvReaderTest { - + @Test public void readTest() { CsvReader reader = new CsvReader(); @@ -85,4 +85,16 @@ public class CsvReaderTest { Console.log(strings); } } + + @Test + @Ignore + public void readTest3(){ + final CsvReadConfig csvReadConfig = CsvReadConfig.defaultConfig(); + csvReadConfig.setContainsHeader(true); + final CsvReader reader = CsvUtil.getReader(csvReadConfig); + final CsvData read = reader.read(FileUtil.file("d:/test/ceshi.csv")); + for (CsvRow row : read) { + Console.log(row.getByName("案件ID")); + } + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/RuntimeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/RuntimeUtilTest.java index 98fcd9969..662542d15 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/RuntimeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/RuntimeUtilTest.java @@ -29,7 +29,7 @@ public class RuntimeUtilTest { @Test @Ignore public void execCmdTest2() { - String str = RuntimeUtil.execForStr("cmd /c cd C:\\Program Files (x86)"); + String str = RuntimeUtil.execForStr("cmd /c", "cd \"C:\\Program Files (x86)\"", "chdir"); Console.log(str); } diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 9b9f14a60..5d4e89607 100644 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-cron diff --git a/hutool-cron/src/main/java/cn/hutool/cron/listener/TaskListenerManager.java b/hutool-cron/src/main/java/cn/hutool/cron/listener/TaskListenerManager.java index f0882d98a..10c609fa8 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/listener/TaskListenerManager.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/listener/TaskListenerManager.java @@ -16,7 +16,7 @@ public class TaskListenerManager implements Serializable { private static final long serialVersionUID = 1L; private final List listeners = new ArrayList<>(); - + /** * 增加监听器 * @param listener {@link TaskListener} @@ -28,7 +28,7 @@ public class TaskListenerManager implements Serializable { } return this; } - + /** * 移除监听器 * @param listener {@link TaskListener} @@ -40,14 +40,13 @@ public class TaskListenerManager implements Serializable { } return this; } - + /** * 通知所有监听任务启动器启动 * @param executor {@link TaskExecutor} */ public void notifyTaskStart(TaskExecutor executor) { synchronized (listeners) { - int size = listeners.size(); TaskListener listener; for (TaskListener taskListener : listeners) { listener = taskListener; @@ -57,20 +56,19 @@ public class TaskListenerManager implements Serializable { } } } - + /** * 通知所有监听任务启动器成功结束 * @param executor {@link TaskExecutor} */ public void notifyTaskSucceeded(TaskExecutor executor) { synchronized (listeners) { - int size = listeners.size(); for (TaskListener listener : listeners) { listener.onSucceeded(executor); } } } - + /** * 通知所有监听任务启动器结束并失败
    * 无监听将打印堆栈到命令行 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/TimerTaskList.java b/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/TimerTaskList.java index 3e3d4b342..6de8c3323 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/TimerTaskList.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/TimerTaskList.java @@ -76,7 +76,7 @@ public class TimerTaskList implements Delayed { */ public void removeTask(TimerTask timerTask) { synchronized (this) { - if (timerTask.timerTaskList.equals(this)) { + if (this.equals(timerTask.timerTaskList)) { timerTask.next.prev = timerTask.prev; timerTask.prev.next = timerTask.next; timerTask.timerTaskList = null; diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 0a878b8fe..58c9e7db3 100644 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-crypto diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java index e5719100d..a353cb72d 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java @@ -247,7 +247,7 @@ public class SymmetricCrypto implements Serializable { } /** - * 加密,针对大数据量,结束后不关闭流 + * 加密,针对大数据量,可选结束后是否关闭流 * * @param data 被加密的字符串 * @param out 输出流,可以是文件或网络位置 diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index a7d2ace32..2d07b9337 100644 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index be3918d26..d049d83a2 100644 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 482d6fcd5..4c295160d 100644 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-extra diff --git a/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java b/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java index 6472c4e45..1db413a36 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java @@ -42,10 +42,11 @@ public enum BeanCopierCache { * @return 属性名和Map映射的key */ private String genKey(Class srcClass, Class targetClass, Converter converter) { - String key = StrUtil.format("{}#{}", srcClass.getName(), targetClass.getName()); + final StringBuilder key = StrUtil.builder() + .append(srcClass.getName()).append('#').append(targetClass.getName()); if(null != converter){ - key += "#" + converter.getClass().getName(); + key.append('#').append(converter.getClass().getName()); } - return key; + return key.toString(); } } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java index c67c8b096..d8b42e1ae 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java @@ -339,7 +339,7 @@ public class Sftp extends AbstractFtp { return true; } try { - channel.cd(directory.replaceAll("\\\\", "/")); + channel.cd(directory.replace('\\', '/')); return true; } catch (SftpException e) { throw new FtpException(e); diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 98e445e4b..9b42b4a80 100644 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-http diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java index df64abc75..a4612790d 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java @@ -387,7 +387,7 @@ public class HttpRequest extends HttpBase { public boolean isKeepAlive() { String connection = header(Header.CONNECTION); if (connection == null) { - return !httpVersion.equalsIgnoreCase(HTTP_1_0); + return !HTTP_1_0.equalsIgnoreCase(httpVersion); } return false == "close".equalsIgnoreCase(connection); @@ -552,7 +552,7 @@ public class HttpRequest extends HttpBase { } /** - * 设置map类型表单数据 + * 设置map<String, String>类型表单数据 * * @param formMapStr 表单内容 * @return this diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java b/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java index c57b4cac6..70956ae4c 100644 --- a/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java +++ b/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java @@ -109,7 +109,7 @@ public class Platform extends UserAgentInfo { * @since 5.2.3 */ public boolean isIPhoneOrIPod() { - return IPHONE.equals(this) || IPOD.equals(this); + return this.equals(IPHONE) || this.equals(IPOD); } /** @@ -119,7 +119,7 @@ public class Platform extends UserAgentInfo { * @since 5.2.3 */ public boolean isIPad() { - return IPAD.equals(this); + return this.equals(IPAD); } /** @@ -139,7 +139,7 @@ public class Platform extends UserAgentInfo { * @since 5.2.3 */ public boolean isAndroid() { - return ANDROID.equals(this) || GOOGLE_TV.equals(this); + return this.equals(ANDROID) || this.equals(GOOGLE_TV); } } diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 882157fc1..31314acff 100644 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-json diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index db1954d9b..971f7f49f 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -675,14 +675,12 @@ public class JSONUtil { return writer; } - char b; // 前一个字符 char c; // 当前字符 int len = str.length(); if (isWrap) { writer.write('"'); } for (int i = 0; i < len; i++) { -// b = c; c = str.charAt(i); switch (c) { case '\\': @@ -690,13 +688,6 @@ public class JSONUtil { writer.write("\\"); writer.write(c); break; - //此处转义导致输出不和预期一致 -// case '/': -// if (b == '<') { -// writer.write('\\'); -// } -// writer.write(c); -// break; default: writer.write(escape(c)); } diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index 1f2943c5e..e1d649139 100644 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index 305788314..30eb76867 100644 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-poi diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java index cddf33517..181121767 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java @@ -19,18 +19,28 @@ import java.io.InputStream; /** * Excel工具类,不建议直接使用index直接操作sheet,在wps/excel中sheet显示顺序与index无关,还有隐藏sheet - * - * @author Looly * + * @author Looly */ public class ExcelUtil { + /** + * xlx的ContentType + */ + public static final String XLS_CONTENT_TYPE = "application/vnd.ms-excel"; + + /** + * xlsx的ContentType + */ + public static final String XLSX_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + // ------------------------------------------------------------------------------------ Read by Sax start + /** * 通过Sax方式读取Excel,同时支持03和07格式 - * - * @param path Excel文件路径 - * @param rid sheet rid,-1表示全部Sheet, 0表示第一个Sheet + * + * @param path Excel文件路径 + * @param rid sheet rid,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @since 3.2.0 */ @@ -41,8 +51,8 @@ public class ExcelUtil { /** * 通过Sax方式读取Excel,同时支持03和07格式 * - * @param path Excel文件路径 - * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet + * @param path Excel文件路径 + * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet * @param rowHandler 行处理器 * @since 5.4.4 */ @@ -52,9 +62,9 @@ public class ExcelUtil { /** * 通过Sax方式读取Excel,同时支持03和07格式 - * - * @param file Excel文件 - * @param rid sheet rid,-1表示全部Sheet, 0表示第一个Sheet + * + * @param file Excel文件 + * @param rid sheet rid,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @since 3.2.0 */ @@ -66,8 +76,8 @@ public class ExcelUtil { /** * 通过Sax方式读取Excel,同时支持03和07格式 * - * @param file Excel文件 - * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet + * @param file Excel文件 + * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet * @param rowHandler 行处理器 * @since 5.4.4 */ @@ -78,9 +88,9 @@ public class ExcelUtil { /** * 通过Sax方式读取Excel,同时支持03和07格式 - * - * @param in Excel流 - * @param rid sheet rid,-1表示全部Sheet, 0表示第一个Sheet + * + * @param in Excel流 + * @param rid sheet rid,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @since 3.2.0 */ @@ -93,8 +103,8 @@ public class ExcelUtil { /** * 通过Sax方式读取Excel,同时支持03和07格式 * - * @param in Excel流 - * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet + * @param in Excel流 + * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet * @param rowHandler 行处理器 * @since 5.4.4 */ @@ -106,9 +116,9 @@ public class ExcelUtil { /** * Sax方式读取Excel07 - * - * @param in 输入流 - * @param rid Sheet rid,-1表示全部Sheet, 0表示第一个Sheet + * + * @param in 输入流 + * @param rid Sheet rid,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @return {@link Excel07SaxReader} * @since 3.2.0 @@ -125,9 +135,9 @@ public class ExcelUtil { /** * Sax方式读取Excel07 - * - * @param file 文件 - * @param rid Sheet rid,-1表示全部Sheet, 0表示第一个Sheet + * + * @param file 文件 + * @param rid Sheet rid,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @return {@link Excel07SaxReader} * @since 3.2.0 @@ -144,9 +154,9 @@ public class ExcelUtil { /** * Sax方式读取Excel07 - * - * @param path 路径 - * @param rid Sheet rid,-1表示全部Sheet, 0表示第一个Sheet + * + * @param path 路径 + * @param rid Sheet rid,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @return {@link Excel07SaxReader} * @since 3.2.0 @@ -163,8 +173,8 @@ public class ExcelUtil { /** * Sax方式读取Excel03 - * - * @param in 输入流 + * + * @param in 输入流 * @param sheetIndex Sheet索引,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @return {@link Excel03SaxReader} @@ -182,8 +192,8 @@ public class ExcelUtil { /** * Sax方式读取Excel03 - * - * @param file 文件 + * + * @param file 文件 * @param sheetIndex Sheet索引,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @return {@link Excel03SaxReader} @@ -201,8 +211,8 @@ public class ExcelUtil { /** * Sax方式读取Excel03 - * - * @param path 路径 + * + * @param path 路径 * @param sheetIndex Sheet索引,-1表示全部Sheet, 0表示第一个Sheet * @param rowHandler 行处理器 * @return {@link Excel03SaxReader} @@ -220,10 +230,11 @@ public class ExcelUtil { // ------------------------------------------------------------------------------------ Read by Sax end // ------------------------------------------------------------------------------------------------ getReader + /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容
    * 默认调用第一个sheet - * + * * @param bookFilePath Excel文件路径,绝对路径或相对于ClassPath路径 * @return {@link ExcelReader} * @since 3.1.1 @@ -235,7 +246,7 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容
    * 默认调用第一个sheet - * + * * @param bookFile Excel文件 * @return {@link ExcelReader} */ @@ -245,9 +256,9 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容 - * + * * @param bookFilePath Excel文件路径,绝对路径或相对于ClassPath路径 - * @param sheetIndex sheet序号,0表示第一个sheet + * @param sheetIndex sheet序号,0表示第一个sheet * @return {@link ExcelReader} * @since 3.1.1 */ @@ -261,8 +272,8 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容 - * - * @param bookFile Excel文件 + * + * @param bookFile Excel文件 * @param sheetIndex sheet序号,0表示第一个sheet * @return {@link ExcelReader} */ @@ -276,8 +287,8 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容 - * - * @param bookFile Excel文件 + * + * @param bookFile Excel文件 * @param sheetName sheet名,第一个默认是sheet1 * @return {@link ExcelReader} */ @@ -292,7 +303,7 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容
    * 默认调用第一个sheet,读取结束自动关闭流 - * + * * @param bookStream Excel文件的流 * @return {@link ExcelReader} */ @@ -303,8 +314,8 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容
    * 默认调用第一个sheet - * - * @param bookStream Excel文件的流 + * + * @param bookStream Excel文件的流 * @param closeAfterRead 读取结束是否关闭流 * @return {@link ExcelReader} * @since 4.0.3 @@ -320,7 +331,7 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容
    * 读取结束自动关闭流 - * + * * @param bookStream Excel文件的流 * @param sheetIndex sheet序号,0表示第一个sheet * @return {@link ExcelReader} @@ -335,9 +346,9 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容 - * - * @param bookStream Excel文件的流 - * @param sheetIndex sheet序号,0表示第一个sheet + * + * @param bookStream Excel文件的流 + * @param sheetIndex sheet序号,0表示第一个sheet * @param closeAfterRead 读取结束是否关闭流 * @return {@link ExcelReader} * @since 4.0.3 @@ -355,9 +366,9 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容
    * 读取结束自动关闭流 - * + * * @param bookStream Excel文件的流 - * @param sheetName sheet名,第一个默认是sheet1 + * @param sheetName sheet名,第一个默认是sheet1 * @return {@link ExcelReader} */ public static ExcelReader getReader(InputStream bookStream, String sheetName) { @@ -370,9 +381,9 @@ public class ExcelUtil { /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容 - * - * @param bookStream Excel文件的流 - * @param sheetName sheet名,第一个默认是sheet1 + * + * @param bookStream Excel文件的流 + * @param sheetName sheet名,第一个默认是sheet1 * @param closeAfterRead 读取结束是否关闭流 * @return {@link ExcelReader} * @deprecated 使用完毕无论是否closeAfterRead,poi会关闭流,此参数无意义。 @@ -387,11 +398,12 @@ public class ExcelUtil { } // ------------------------------------------------------------------------------------------------ getWriter + /** * 获得{@link ExcelWriter},默认写出到第一个sheet
    * 不传入写出的Excel文件路径,只能调用ExcelWriter#flush(OutputStream)方法写出到流
    * 若写出到文件,还需调用{@link ExcelWriter#setDestFile(File)}方法自定义写出的文件,然后调用{@link ExcelWriter#flush()}方法写出到文件 - * + * * @return {@link ExcelWriter} * @since 3.2.1 */ @@ -407,7 +419,7 @@ public class ExcelUtil { * 获得{@link ExcelWriter},默认写出到第一个sheet
    * 不传入写出的Excel文件路径,只能调用ExcelWriter#flush(OutputStream)方法写出到流
    * 若写出到文件,还需调用{@link ExcelWriter#setDestFile(File)}方法自定义写出的文件,然后调用{@link ExcelWriter#flush()}方法写出到文件 - * + * * @param isXlsx 是否为xlsx格式 * @return {@link ExcelWriter} * @since 3.2.1 @@ -422,7 +434,7 @@ public class ExcelUtil { /** * 获得{@link ExcelWriter},默认写出到第一个sheet - * + * * @param destFilePath 目标文件路径 * @return {@link ExcelWriter} */ @@ -433,17 +445,17 @@ public class ExcelUtil { throw new DependencyException(ObjectUtil.defaultIfNull(e.getCause(), e), PoiChecker.NO_POI_ERROR_MSG); } } - + /** * 获得{@link ExcelWriter},默认写出到第一个sheet - * + * * @param sheetName Sheet名 * @return {@link ExcelWriter} * @since 4.5.18 */ public static ExcelWriter getWriterWithSheet(String sheetName) { try { - return new ExcelWriter((File)null, sheetName); + return new ExcelWriter((File) null, sheetName); } catch (NoClassDefFoundError e) { throw new DependencyException(ObjectUtil.defaultIfNull(e.getCause(), e), PoiChecker.NO_POI_ERROR_MSG); } @@ -451,7 +463,7 @@ public class ExcelUtil { /** * 获得{@link ExcelWriter},默认写出到第一个sheet,名字为sheet1 - * + * * @param destFile 目标文件 * @return {@link ExcelWriter} */ @@ -465,9 +477,9 @@ public class ExcelUtil { /** * 获得{@link ExcelWriter} - * + * * @param destFilePath 目标文件路径 - * @param sheetName sheet表名 + * @param sheetName sheet表名 * @return {@link ExcelWriter} */ public static ExcelWriter getWriter(String destFilePath, String sheetName) { @@ -480,8 +492,8 @@ public class ExcelUtil { /** * 获得{@link ExcelWriter} - * - * @param destFile 目标文件 + * + * @param destFile 目标文件 * @param sheetName sheet表名 * @return {@link ExcelWriter} */ @@ -494,11 +506,12 @@ public class ExcelUtil { } // ------------------------------------------------------------------------------------------------ getBigWriter + /** * 获得{@link BigExcelWriter},默认写出到第一个sheet
    * 不传入写出的Excel文件路径,只能调用ExcelWriter#flush(OutputStream)方法写出到流
    * 若写出到文件,还需调用{@link BigExcelWriter#setDestFile(File)}方法自定义写出的文件,然后调用{@link BigExcelWriter#flush()}方法写出到文件 - * + * * @return {@link BigExcelWriter} * @since 4.1.13 */ @@ -514,7 +527,7 @@ public class ExcelUtil { * 获得{@link BigExcelWriter},默认写出到第一个sheet
    * 不传入写出的Excel文件路径,只能调用ExcelWriter#flush(OutputStream)方法写出到流
    * 若写出到文件,还需调用{@link BigExcelWriter#setDestFile(File)}方法自定义写出的文件,然后调用{@link BigExcelWriter#flush()}方法写出到文件 - * + * * @param rowAccessWindowSize 在内存中的行数 * @return {@link BigExcelWriter} * @since 4.1.13 @@ -529,7 +542,7 @@ public class ExcelUtil { /** * 获得{@link BigExcelWriter},默认写出到第一个sheet - * + * * @param destFilePath 目标文件路径 * @return {@link BigExcelWriter} */ @@ -543,7 +556,7 @@ public class ExcelUtil { /** * 获得{@link BigExcelWriter},默认写出到第一个sheet,名字为sheet1 - * + * * @param destFile 目标文件 * @return {@link BigExcelWriter} */ @@ -557,9 +570,9 @@ public class ExcelUtil { /** * 获得{@link BigExcelWriter} - * + * * @param destFilePath 目标文件路径 - * @param sheetName sheet表名 + * @param sheetName sheet表名 * @return {@link BigExcelWriter} */ public static BigExcelWriter getBigWriter(String destFilePath, String sheetName) { @@ -572,8 +585,8 @@ public class ExcelUtil { /** * 获得{@link BigExcelWriter} - * - * @param destFile 目标文件 + * + * @param destFile 目标文件 * @param sheetName sheet表名 * @return {@link BigExcelWriter} */ @@ -587,7 +600,7 @@ public class ExcelUtil { /** * 将Sheet列号变为列名 - * + * * @param index 列号, 从0开始 * @return 0-》A; 1-》B...26-》AA * @since 4.1.20 @@ -610,7 +623,7 @@ public class ExcelUtil { /** * 根据表元的列名转换为列号 - * + * * @param colName 列名, 从A开始 * @return A1-》0; B1-》1...AA1-》26 * @since 4.1.20 @@ -637,9 +650,9 @@ public class ExcelUtil { * @return 坐标点,x表示行,从0开始,y表示列,从0开始 * @since 5.1.4 */ - public static CellLocation toLocation(String locationRef){ + public static CellLocation toLocation(String locationRef) { final int x = colNameToIndex(locationRef); - final int y = ReUtil.getFirstNumber(locationRef) -1; + final int y = ReUtil.getFirstNumber(locationRef) - 1; return new CellLocation(x, y); } } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java index d4abc369b..a5272f9b2 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java @@ -382,6 +382,20 @@ public class ExcelWriter extends ExcelBase { return StrUtil.format("attachment; filename=\"{}\"; filename*={}''{}", fileName, charset.name(), fileName); } + /** + * 获取Content-Type头对应的值,可以通过调用以下方法快速设置下载Excel的头信息: + * + *
    +	 * response.setContentType(excelWriter.getContentType());
    +	 * 
    + * + * @return Content-Type值 + * @since 5.6.7 + */ + public String getContentType() { + return isXlsx() ? ExcelUtil.XLSX_CONTENT_TYPE : ExcelUtil.XLS_CONTENT_TYPE; + } + /** * 设置当前所在行 * @@ -395,10 +409,11 @@ public class ExcelWriter extends ExcelBase { /** * 定位到最后一行的后边,用于追加数据 + * * @return this * @since 5.5.0 */ - public ExcelWriter setCurrentRowToEnd(){ + public ExcelWriter setCurrentRowToEnd() { return setCurrentRow(getRowCount()); } @@ -730,12 +745,12 @@ public class ExcelWriter extends ExcelBase { * 合并单元格,并写入对象到单元格,使用指定的样式
    * 指定样式传入null,则不使用任何样式 * - * @param firstRow 起始行,0开始 - * @param lastRow 结束行,0开始 - * @param firstColumn 起始列,0开始 - * @param lastColumn 结束列,0开始 - * @param content 合并单元格后的内容 - * @param cellStyle 合并后单元格使用的样式,可以为null + * @param firstRow 起始行,0开始 + * @param lastRow 结束行,0开始 + * @param firstColumn 起始列,0开始 + * @param lastColumn 结束列,0开始 + * @param content 合并单元格后的内容 + * @param cellStyle 合并后单元格使用的样式,可以为null * @return this * @since 5.6.5 */ @@ -873,14 +888,14 @@ public class ExcelWriter extends ExcelBase { * 样式为默认标题样式,可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式 * *

    - * 此方法的逻辑是:将一行数据写出到当前行,遇到已存在的单元格跳过,不存在的创建并赋值。 + * 此方法的逻辑是:将一行数据写出到当前行,遇到已存在的单元格跳过,不存在的创建并赋值。 *

    * * @param rowData 一行的数据 * @return this */ - public ExcelWriter writeSecHeadRow(Iterable rowData){ - final Row row = RowUtil.getOrCreateRow(this.sheet,this.currentRow.getAndIncrement()); + public ExcelWriter writeSecHeadRow(Iterable rowData) { + final Row row = RowUtil.getOrCreateRow(this.sheet, this.currentRow.getAndIncrement()); Iterator iterator = rowData.iterator(); //如果获取的row存在单元格,则执行复杂表头逻辑,否则直接调用writeHeadRow(Iterable rowData) if (row.getLastCellNum() != 0) { @@ -1093,12 +1108,12 @@ public class ExcelWriter extends ExcelBase { /** * 设置列的默认样式 * - * @param x 列号,从0开始 + * @param x 列号,从0开始 * @param style 样式 * @return this * @since 5.6.4 */ - public ExcelWriter setColumnStyle(int x, CellStyle style){ + public ExcelWriter setColumnStyle(int x, CellStyle style) { this.sheet.setDefaultColumnStyle(x, style); return this; } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java index fb8501d90..0cdd3f054 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java @@ -385,7 +385,6 @@ public class Excel03SaxReader implements HSSFListener, ExcelSaxReader cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-script diff --git a/hutool-script/src/main/java/cn/hutool/script/ScriptRuntimeException.java b/hutool-script/src/main/java/cn/hutool/script/ScriptRuntimeException.java index 2b49a37e5..84f2ede94 100644 --- a/hutool-script/src/main/java/cn/hutool/script/ScriptRuntimeException.java +++ b/hutool-script/src/main/java/cn/hutool/script/ScriptRuntimeException.java @@ -81,19 +81,19 @@ public class ScriptRuntimeException extends RuntimeException { */ @Override public String getMessage() { - String ret = super.getMessage(); + StringBuilder ret = new StringBuilder().append(super.getMessage()); if (fileName != null) { - ret += (" in " + fileName); + ret.append(" in ").append(fileName); if (lineNumber != -1) { - ret += " at line number " + lineNumber; + ret.append(" at line number ").append(lineNumber); } if (columnNumber != -1) { - ret += " at column number " + columnNumber; + ret.append(" at column number ").append(columnNumber); } } - return ret; + return ret.toString(); } /** diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 79b72a661..2ebb31cfb 100644 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 5e2bb1b82..139a618b1 100644 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 96fd57899..f24e716b0 100644 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool-system diff --git a/pom.xml b/pom.xml index 0b20a4af6..66b06fc80 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.6.7-SNAPSHOT + 5.6.8-SNAPSHOT hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/looly/hutool