diff --git a/CHANGELOG.md b/CHANGELOG.md index 8073a66c7..d89819707 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,24 @@ ------------------------------------------------------------------------------------------------------------- +# 5.5.5 (2020-12-17) + +### 新特性 +* 【core 】 URLUtil.normalize新增重载(pr#233@Gitee) +* 【core 】 PathUtil增加isSub和toAbsNormal方法 + +### Bug修复 +* 【core 】 FileUtil.isSub相对路径判断问题(pr#1315@Github) + +------------------------------------------------------------------------------------------------------------- +# 5.5.4 (2020-12-16) + +### 新特性 +### Bug修复 +* 【core 】 修复IoUtil.readBytes的问题 + +------------------------------------------------------------------------------------------------------------- + # 5.5.3 (2020-12-11) ### 新特性 @@ -21,6 +39,8 @@ * 【core 】 增加NioUtil * 【core 】 增加GanymedUtil * 【poi 】 增加OFD支持,OfdWriter +* 【poi 】 修复NumberUtil属性拼写错误(pr#1311@Github) +* 【core 】 MapUtil增加getQuietly方法(issue#I29IWO@Gitee) ### Bug修复 * 【cache 】 修复Cache中get重复misCount计数问题(issue#1281@Github) @@ -34,6 +54,7 @@ * 【core 】 修复FileUtil.loopFiles使用FileFilter无效问题(issue#I28V48@Gitee) * 【extra 】 修复JschUtil.execByShell返回空的问题(issue#1067@Github) * 【poi 】 修复特殊的excel使用sax读取时未读到值的问题(issue#1303@Github) +* 【http 】 修复HttpUtil类条件判断错误(pr#232@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/README-EN.md b/README-EN.md index 472d6b799..d71319098 100644 --- a/README-EN.md +++ b/README-EN.md @@ -125,19 +125,19 @@ Each module can be introduced individually, or all modules can be introduced by cn.hutool hutool-all - 5.5.3 + 5.5.5 ``` ### Gradle ``` -compile 'cn.hutool:hutool-all:5.5.3' +compile 'cn.hutool:hutool-all:5.5.5' ``` ## Download -- [Maven1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.5.3/) -- [Maven2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.5.3/) +- [Maven1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.5.5/) +- [Maven2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.5.5/) > 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 76d6ef33f..6bbf71396 100644 --- a/README.md +++ b/README.md @@ -123,21 +123,21 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.5.3 + 5.5.5 ``` ### Gradle ``` -compile 'cn.hutool:hutool-all:5.5.3' +compile 'cn.hutool:hutool-all:5.5.5' ``` ### 非Maven项目 点击以下任一链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.5.3/) -- [Maven中央库2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.5.3/) +- [Maven中央库1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.5.5/) +- [Maven中央库2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.5.5/) > 注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index d4e50692a..e69889c7f 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.5.3 +5.5.5 diff --git a/docs/js/version.js b/docs/js/version.js index f133da001..bb06014fa 100644 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.5.3' \ No newline at end of file +var version = '5.5.5' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index ae2daea7e..0020eaf2b 100644 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.5.3-SNAPSHOT + 5.5.5-SNAPSHOT hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index a5db73731..baf95f5c1 100644 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.5.3-SNAPSHOT + 5.5.5-SNAPSHOT hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index e1ad8127b..dd38d715e 100644 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.5.3-SNAPSHOT + 5.5.5-SNAPSHOT hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 2e1791ca9..c71df6274 100644 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.5.3-SNAPSHOT + 5.5.5-SNAPSHOT hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index d24ef2f04..e6c93cea1 100644 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.5.3-SNAPSHOT + 5.5.5-SNAPSHOT hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 1ae88a98f..f9e94afae 100644 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.5.3-SNAPSHOT + 5.5.5-SNAPSHOT hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 3680e13a0..52cc2738e 100644 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -17,7 +17,7 @@ cn.hutool hutool-parent - 5.5.3-SNAPSHOT + 5.5.5-SNAPSHOT hutool-core diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Base64.java b/hutool-core/src/main/java/cn/hutool/core/codec/Base64.java index 5aa6ea320..e7843be05 100644 --- a/hutool-core/src/main/java/cn/hutool/core/codec/Base64.java +++ b/hutool-core/src/main/java/cn/hutool/core/codec/Base64.java @@ -14,17 +14,17 @@ import java.nio.charset.Charset; * Base64工具类,提供Base64的编码和解码方案
* base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,
* 也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。 - * - * @author Looly * + * @author Looly */ public class Base64 { // -------------------------------------------------------------------- encode + /** * 编码为Base64,非URL安全的 - * - * @param arr 被编码的数组 + * + * @param arr 被编码的数组 * @param lineSep 在76个char之后是CRLF还是EOF * @return 编码后的bytes */ @@ -34,8 +34,8 @@ public class Base64 { /** * 编码为Base64,URL安全的 - * - * @param arr 被编码的数组 + * + * @param arr 被编码的数组 * @param lineSep 在76个char之后是CRLF还是EOF * @return 编码后的bytes * @since 3.0.6 @@ -46,7 +46,7 @@ public class Base64 { /** * base64编码 - * + * * @param source 被编码的base64字符串 * @return 被加密后的字符串 */ @@ -56,7 +56,7 @@ public class Base64 { /** * base64编码,URL安全 - * + * * @param source 被编码的base64字符串 * @return 被加密后的字符串 * @since 3.0.6 @@ -67,8 +67,8 @@ public class Base64 { /** * base64编码 - * - * @param source 被编码的base64字符串 + * + * @param source 被编码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 */ @@ -79,7 +79,8 @@ public class Base64 { /** * base64编码,不进行padding(末尾不会填充'=') * - * @param source 被编码的base64字符串 + * @param source 被编码的base64字符串 + * @param charset 编码 * @return 被加密后的字符串 * @since 5.5.2 */ @@ -89,8 +90,8 @@ public class Base64 { /** * base64编码,URL安全 - * - * @param source 被编码的base64字符串 + * + * @param source 被编码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 * @since 3.0.6 @@ -101,8 +102,8 @@ public class Base64 { /** * base64编码 - * - * @param source 被编码的base64字符串 + * + * @param source 被编码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 */ @@ -112,8 +113,8 @@ public class Base64 { /** * base64编码,URL安全的 - * - * @param source 被编码的base64字符串 + * + * @param source 被编码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 * @since 3.0.6 @@ -124,7 +125,7 @@ public class Base64 { /** * base64编码 - * + * * @param source 被编码的base64字符串 * @return 被加密后的字符串 */ @@ -145,7 +146,7 @@ public class Base64 { /** * base64编码,URL安全的 - * + * * @param source 被编码的base64字符串 * @return 被加密后的字符串 * @since 3.0.6 @@ -156,7 +157,7 @@ public class Base64 { /** * base64编码 - * + * * @param in 被编码base64的流(一般为图片流或者文件流) * @return 被加密后的字符串 * @since 4.0.9 @@ -167,7 +168,7 @@ public class Base64 { /** * base64编码,URL安全的 - * + * * @param in 被编码base64的流(一般为图片流或者文件流) * @return 被加密后的字符串 * @since 4.0.9 @@ -178,7 +179,7 @@ public class Base64 { /** * base64编码 - * + * * @param file 被编码base64的文件 * @return 被加密后的字符串 * @since 4.0.9 @@ -189,7 +190,7 @@ public class Base64 { /** * base64编码,URL安全的 - * + * * @param file 被编码base64的文件 * @return 被加密后的字符串 * @since 4.0.9 @@ -200,11 +201,11 @@ public class Base64 { /** * 编码为Base64
- * 如果isMultiLine为true,则每76个字符一个换行符,否则在一行显示 - * - * @param arr 被编码的数组 + * 如果isMultiLine为{@code true},则每76个字符一个换行符,否则在一行显示 + * + * @param arr 被编码的数组 * @param isMultiLine 在76个char之后是CRLF还是EOF - * @param isUrlSafe 是否使用URL安全字符,一般为false + * @param isUrlSafe 是否使用URL安全字符,一般为{@code false} * @return 编码后的bytes */ public static byte[] encode(byte[] arr, boolean isMultiLine, boolean isUrlSafe) { @@ -212,9 +213,10 @@ public class Base64 { } // -------------------------------------------------------------------- decode + /** * base64解码 - * + * * @param source 被解码的base64字符串 * @return 被加密后的字符串 * @since 4.3.2 @@ -225,7 +227,7 @@ public class Base64 { /** * base64解码 - * + * * @param source 被解码的base64字符串 * @return 被加密后的字符串 */ @@ -235,8 +237,8 @@ public class Base64 { /** * base64解码 - * - * @param source 被解码的base64字符串 + * + * @param source 被解码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 */ @@ -246,8 +248,8 @@ public class Base64 { /** * base64解码 - * - * @param source 被解码的base64字符串 + * + * @param source 被解码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 */ @@ -257,8 +259,8 @@ public class Base64 { /** * base64解码 - * - * @param base64 被解码的base64字符串 + * + * @param base64 被解码的base64字符串 * @param destFile 目标文件 * @return 目标文件 * @since 4.0.9 @@ -269,9 +271,9 @@ public class Base64 { /** * base64解码 - * - * @param base64 被解码的base64字符串 - * @param out 写出到的流 + * + * @param base64 被解码的base64字符串 + * @param out 写出到的流 * @param isCloseOut 是否关闭输出流 * @since 4.0.9 */ @@ -281,7 +283,7 @@ public class Base64 { /** * base64解码 - * + * * @param base64 被解码的base64字符串 * @return 被加密后的字符串 */ @@ -291,11 +293,11 @@ public class Base64 { /** * base64解码 - * - * @param source 被解码的base64字符串 + * + * @param source 被解码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 - *@deprecated 编码参数无意义,作废 + * @deprecated 编码参数无意义,作废 */ @Deprecated public static byte[] decode(CharSequence source, String charset) { @@ -304,11 +306,11 @@ public class Base64 { /** * base64解码 - * - * @param source 被解码的base64字符串 + * + * @param source 被解码的base64字符串 * @param charset 字符集 * @return 被加密后的字符串 - *@deprecated 编码参数无意义,作废 + * @deprecated 编码参数无意义,作废 */ @Deprecated public static byte[] decode(CharSequence source, Charset charset) { @@ -317,7 +319,7 @@ public class Base64 { /** * 解码Base64 - * + * * @param in 输入 * @return 解码后的bytes */ 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 33c2b700b..1df7cefd8 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 @@ -1,10 +1,10 @@ package cn.hutool.core.codec; -import java.nio.charset.Charset; - import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; +import java.nio.charset.Charset; + /** * Base64编码 * @@ -128,11 +128,11 @@ public class Base64Encoder { /** * 编码为Base64
- * 如果isMultiLine为true,则每76个字符一个换行符,否则在一行显示 + * 如果isMultiLine为{@code true},则每76个字符一个换行符,否则在一行显示 * * @param arr 被编码的数组 * @param isMultiLine 在76个char之后是CRLF还是EOF - * @param isUrlSafe 是否使用URL安全字符,一般为false + * @param isUrlSafe 是否使用URL安全字符,一般为{@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/convert/Convert.java b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java index 052ae30e7..06d70e621 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java @@ -49,7 +49,7 @@ public class Convert { /** * 转换为字符串
- * 如果给定的值为null,或者转换失败,返回默认值null
+ * 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -85,7 +85,7 @@ public class Convert { /** * 转换为字符
- * 如果给定的值为null,或者转换失败,返回默认值null
+ * 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -108,7 +108,7 @@ public class Convert { /** * 转换为byte
- * 如果给定的值为null,或者转换失败,返回默认值
+ * 如果给定的值为{@code null},或者转换失败,返回默认值
* 转换失败不会报错 * * @param value 被转换的值 @@ -121,7 +121,7 @@ public class Convert { /** * 转换为byte
- * 如果给定的值为null,或者转换失败,返回默认值null
+ * 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -155,7 +155,7 @@ public class Convert { /** * 转换为Short
- * 如果给定的值为null,或者转换失败,返回默认值
+ * 如果给定的值为{@code null},或者转换失败,返回默认值
* 转换失败不会报错 * * @param value 被转换的值 @@ -168,7 +168,7 @@ public class Convert { /** * 转换为Short
- * 如果给定的值为null,或者转换失败,返回默认值null
+ * 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -204,7 +204,7 @@ public class Convert { /** * 转换为Number
- * 如果给定的值为空,或者转换失败,返回默认值null
+ * 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -240,7 +240,7 @@ public class Convert { /** * 转换为int
- * 如果给定的值为null,或者转换失败,返回默认值null
+ * 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -275,7 +275,7 @@ public class Convert { /** * 转换为long
- * 如果给定的值为null,或者转换失败,返回默认值null
+ * 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -310,7 +310,7 @@ public class Convert { /** * 转换为double
- * 如果给定的值为空,或者转换失败,返回默认值null
+ * 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -345,7 +345,7 @@ public class Convert { /** * 转换为Float
- * 如果给定的值为空,或者转换失败,返回默认值null
+ * 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -380,7 +380,7 @@ public class Convert { /** * 转换为boolean
- * 如果给定的值为空,或者转换失败,返回默认值null
+ * 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -415,7 +415,7 @@ public class Convert { /** * 转换为BigInteger
- * 如果给定的值为空,或者转换失败,返回默认值null
+ * 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -480,7 +480,7 @@ public class Convert { /** * 转换为LocalDateTime
- * 如果给定的值为空,或者转换失败,返回null
+ * 如果给定的值为空,或者转换失败,返回{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -506,7 +506,7 @@ public class Convert { /** * 转换为Date
- * 如果给定的值为空,或者转换失败,返回null
+ * 如果给定的值为空,或者转换失败,返回{@code null}
* 转换失败不会报错 * * @param value 被转换的值 @@ -534,7 +534,7 @@ public class Convert { /** * 转换为Enum对象
- * 如果给定的值为空,或者转换失败,返回默认值null
+ * 如果给定的值为空,或者转换失败,返回默认值{@code null}
* * @param 枚举类型 * @param clazz Enum的Class diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java index 2eccd286e..d0b59ab37 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -3194,7 +3194,7 @@ public class FileUtil extends PathUtil { public static boolean isSub(File parent, File sub) { Assert.notNull(parent); Assert.notNull(sub); - return sub.toPath().startsWith(parent.toPath()); + return isSub(parent.toPath(), sub.toPath()); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java index 6feba0a8f..ce5bbcc82 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java @@ -43,7 +43,7 @@ import java.util.zip.Checksum; * * @author xiaoleilu */ -public class IoUtil extends NioUtil{ +public class IoUtil extends NioUtil { // -------------------------------------------------------------------------------------- Copy start @@ -330,7 +330,7 @@ public class IoUtil extends NioUtil{ } /** - * 从流中读取内容 + * 从流中读取内容,读取完成后关闭流 * * @param in 输入流 * @param charsetName 字符集 @@ -338,7 +338,7 @@ public class IoUtil extends NioUtil{ * @throws IORuntimeException IO异常 */ public static String read(InputStream in, String charsetName) throws IORuntimeException { - FastByteArrayOutputStream out = read(in); + final FastByteArrayOutputStream out = read(in); return StrUtil.isBlank(charsetName) ? out.toString() : out.toString(charsetName); } @@ -362,8 +362,27 @@ public class IoUtil extends NioUtil{ * @throws IORuntimeException IO异常 */ public static FastByteArrayOutputStream read(InputStream in) throws IORuntimeException { + return read(in, true); + } + + /** + * 从流中读取内容,读到输出流中,读取完毕后并不关闭流 + * + * @param in 输入流 + * @param isClose 读取完毕后是否关闭流 + * @return 输出流 + * @throws IORuntimeException IO异常 + * @since 5.5.3 + */ + public static FastByteArrayOutputStream read(InputStream in, boolean isClose) throws IORuntimeException { final FastByteArrayOutputStream out = new FastByteArrayOutputStream(); - copy(in, out); + try { + copy(in, out); + } finally { + if (isClose) { + close(in); + } + } return out; } @@ -417,26 +436,31 @@ public class IoUtil extends NioUtil{ /** * 从流中读取bytes * - * @param in {@link InputStream} - * @param isCloseStream 是否关闭输入流 + * @param in {@link InputStream} + * @param isCLose 是否关闭输入流 * @return bytes * @throws IORuntimeException IO异常 * @since 5.0.4 */ - public static byte[] readBytes(InputStream in, boolean isCloseStream) throws IORuntimeException { - final InputStream availableStream = toAvailableStream(in); - try{ - final int available = availableStream.available(); - if(available > 0){ - byte[] result = new byte[available]; - //noinspection ResultOfMethodCallIgnored - availableStream.read(result); - return result; + public static byte[] readBytes(InputStream in, boolean isCLose) throws IORuntimeException { + if (in instanceof FileInputStream) { + // 文件流的长度是可预见的,此时直接读取效率更高 + final byte[] result; + try { + final int available = in.available(); + result = new byte[available]; + final int readLength = in.read(result); + if (readLength != available) { + throw new IOException(StrUtil.format("File length is [{}] but read [{}]!", available, readLength)); + } + } catch (IOException e) { + throw new IORuntimeException(e); } - } catch (IOException e){ - throw new IORuntimeException(e); + return result; } - return new byte[0]; + + // 未知bytes总量的流 + return read(in, isCLose).toByteArray(); } /** @@ -804,6 +828,7 @@ public class IoUtil extends NioUtil{ * 将指定{@link InputStream} 转换为{@link InputStream#available()}方法可用的流。
* 在Socket通信流中,服务端未返回数据情况下{@link InputStream#available()}方法始终为{@code 0}
* 因此,在读取前需要调用{@link InputStream#read()}读取一个字节(未返回会阻塞),一旦读取到了,{@link InputStream#available()}方法就正常了。
+ * 需要注意的是,在网络流中,是按照块来传输的,所以 {@link InputStream#available()} 读取到的并非最终长度,而是此次块的长度。
* 此方法返回对象的规则为: * *