diff --git a/CHANGELOG.md b/CHANGELOG.md index dac682b26..6e06a0da3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【core 】 MapBuilder增加put方法(pr#367@Gitee) * 【core 】 StrUtil.insert支持负数index * 【core 】 Calculator类支持取模运算(issue#I40DUW@Gitee) +* 【core 】 增加Base64.isBase64方法(issue#1710@Github) ### 🐞Bug修复 * 【core 】 修复FileUtil.normalize处理上级路径的问题(issue#I3YPEH@Gitee) 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 729fb9ec3..8564b008e 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 @@ -314,4 +314,43 @@ public class Base64 { public static byte[] decode(byte[] in) { return Base64Decoder.decode(in); } + + /** + * 检查是否为Base64 + * + * @param base64 Base64的bytes + * @return 是否为Base64 + * @since 5.7.5 + */ + public static boolean isBase64(String base64){ + return isBase64(StrUtil.utf8Bytes(base64)); + } + + /** + * 检查是否为Base64 + * + * @param base64Bytes Base64的bytes + * @return 是否为Base64 + * @since 5.7.5 + */ + public static boolean isBase64(byte[] base64Bytes){ + for (byte base64Byte : base64Bytes) { + if (false == (Base64Decoder.isBase64Code(base64Byte) || isWhiteSpace(base64Byte))) { + return false; + } + } + return true; + } + + private static boolean isWhiteSpace(byte byteToCheck) { + switch (byteToCheck) { + case ' ' : + case '\n' : + case '\r' : + case '\t' : + return true; + default : + return false; + } + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java index 7f2346519..b71aaccf5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java +++ b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java @@ -1,11 +1,11 @@ package cn.hutool.core.codec; -import java.nio.charset.Charset; - import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; +import java.nio.charset.Charset; + /** * Base64解码实现 * @@ -130,6 +130,17 @@ public class Base64Decoder { } } + /** + * 给定的字符是否为Base64字符 + * + * @param octet 被检查的字符 + * @return 是否为Base64字符 + * @since 5.7.5 + */ + public static boolean isBase64Code(byte octet) { + return octet == '=' || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1); + } + // ----------------------------------------------------------------------------------------------- Private start /** * 获取下一个有效的byte字符 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 731e3dca9..17a88ae0c 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 @@ -1479,7 +1479,8 @@ public class FileUtil extends PathUtil { } // issue#1703@Github - if(tops > 0){ + if(tops > 0 && StrUtil.isEmpty(prefix)){ + // 只有相对路径补充开头的..,绝对路径直接忽略之 while (tops-- > 0){ //遍历完节点发现还有上级标注(即开头有一个或多个..),补充之 // Normal path element found. 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 68e14483d..a8409e6d0 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 @@ -75,18 +75,6 @@ public class MapBuilder implements Serializable { return this; } - /** - * 链式Map创建 - * - * @param k Key类型 - * @param supplier Value类型结果提供方 - * @return 当前类 - * @since 5.7.5 - */ - public MapBuilder put(K k, Supplier supplier) { - return put(k, supplier.get()); - } - /** * 链式Map创建 * @@ -114,7 +102,7 @@ public class MapBuilder implements Serializable { */ public MapBuilder put(boolean condition, K k, Supplier supplier) { if (condition) { - put(k, supplier); + put(k, supplier.get()); } return this; } 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 7f0c7416b..0fd6e4f06 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 @@ -1,6 +1,7 @@ package cn.hutool.core.codec; import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import org.junit.Assert; import org.junit.Test; @@ -13,6 +14,11 @@ import org.junit.Test; */ public class Base64Test { + @Test + public void isBase64Test(){ + Assert.assertTrue(Base64.isBase64(Base64.encode(RandomUtil.randomString(100)))); + } + @Test public void encodeAndDecodeTest() { String a = "伦家是一个非常长的字符串66"; diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java index c628b68d1..a86317baf 100644 --- a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java @@ -147,7 +147,7 @@ public class FileUtilTest { Assert.assertEquals("/bar", FileUtil.normalize("/foo/../bar")); Assert.assertEquals("/bar/", FileUtil.normalize("/foo/../bar/")); Assert.assertEquals("/baz", FileUtil.normalize("/foo/../bar/../baz")); - Assert.assertEquals("/../", FileUtil.normalize("/../")); + Assert.assertEquals("/", FileUtil.normalize("/../")); Assert.assertEquals("foo", FileUtil.normalize("foo/bar/..")); Assert.assertEquals("../bar", FileUtil.normalize("foo/../../bar")); Assert.assertEquals("bar", FileUtil.normalize("foo/../bar")); @@ -155,7 +155,7 @@ public class FileUtilTest { Assert.assertEquals("/bar", FileUtil.normalize("//server/../bar")); Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\foo\\..\\bar")); // - Assert.assertEquals("C:/../bar", FileUtil.normalize("C:\\..\\bar")); + Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\..\\bar")); Assert.assertEquals("../../bar", FileUtil.normalize("../../bar")); Assert.assertEquals("C:/bar", FileUtil.normalize("/C:/bar")); Assert.assertEquals("C:", FileUtil.normalize("C:"));