diff --git a/hutool-core/src/main/java/cn/hutool/core/cache/file/AbstractFileCache.java b/hutool-core/src/main/java/cn/hutool/core/cache/file/AbstractFileCache.java
index f8a04d6fd..427b428da 100755
--- a/hutool-core/src/main/java/cn/hutool/core/cache/file/AbstractFileCache.java
+++ b/hutool-core/src/main/java/cn/hutool/core/cache/file/AbstractFileCache.java
@@ -1,7 +1,7 @@
package cn.hutool.core.cache.file;
import cn.hutool.core.cache.Cache;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import java.io.File;
diff --git a/hutool-core/src/main/java/cn/hutool/core/classloader/JarClassLoader.java b/hutool-core/src/main/java/cn/hutool/core/classloader/JarClassLoader.java
index 435bbac1d..5f0cbd9f0 100644
--- a/hutool-core/src/main/java/cn/hutool/core/classloader/JarClassLoader.java
+++ b/hutool-core/src/main/java/cn/hutool/core/classloader/JarClassLoader.java
@@ -1,7 +1,7 @@
package cn.hutool.core.classloader;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.reflect.MethodUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base62.java b/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base62.java
index 481ea51d8..ff9fdc21b 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base62.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base62.java
@@ -1,6 +1,6 @@
package cn.hutool.core.codec.BaseN;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base64.java b/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base64.java
index 9d76558c6..071ffc209 100755
--- a/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base64.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/BaseN/Base64.java
@@ -1,6 +1,6 @@
package cn.hutool.core.codec.BaseN;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/compress/ZipReader.java b/hutool-core/src/main/java/cn/hutool/core/compress/ZipReader.java
index 3055d8e90..36665ba1a 100755
--- a/hutool-core/src/main/java/cn/hutool/core/compress/ZipReader.java
+++ b/hutool-core/src/main/java/cn/hutool/core/compress/ZipReader.java
@@ -1,7 +1,7 @@
package cn.hutool.core.compress;
import cn.hutool.core.exceptions.ValidateException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/compress/ZipUtil.java b/hutool-core/src/main/java/cn/hutool/core/compress/ZipUtil.java
index 2461e57b6..4d04508f0 100644
--- a/hutool-core/src/main/java/cn/hutool/core/compress/ZipUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/compress/ZipUtil.java
@@ -2,7 +2,7 @@ package cn.hutool.core.compress;
import cn.hutool.core.collection.iter.EnumerationIter;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java b/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java
index e2d39f817..c34dd9e58 100755
--- a/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java
+++ b/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java
@@ -1,6 +1,6 @@
package cn.hutool.core.compress;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.Resource;
diff --git a/hutool-core/src/main/java/cn/hutool/core/date/StopWatch.java b/hutool-core/src/main/java/cn/hutool/core/date/StopWatch.java
index cb3377766..6213e5b87 100755
--- a/hutool-core/src/main/java/cn/hutool/core/date/StopWatch.java
+++ b/hutool-core/src/main/java/cn/hutool/core/date/StopWatch.java
@@ -1,6 +1,6 @@
package cn.hutool.core.date;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.text.StrUtil;
import java.text.NumberFormat;
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/CharsetDetector.java b/hutool-core/src/main/java/cn/hutool/core/io/CharsetDetector.java
index 615ca4814..2b52deb15 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/CharsetDetector.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/CharsetDetector.java
@@ -1,6 +1,7 @@
package cn.hutool.core.io;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.util.ArrayUtil;
import java.io.File;
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileMagicNumber.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileMagicNumber.java
old mode 100755
new mode 100644
similarity index 65%
rename from hutool-core/src/main/java/cn/hutool/core/io/FileMagicNumber.java
rename to hutool-core/src/main/java/cn/hutool/core/io/file/FileMagicNumber.java
index 61c377ffd..01c22a49a
--- a/hutool-core/src/main/java/cn/hutool/core/io/FileMagicNumber.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileMagicNumber.java
@@ -1,4 +1,4 @@
-package cn.hutool.core.io;
+package cn.hutool.core.io.file;
import cn.hutool.core.util.ArrayUtil;
@@ -13,25 +13,34 @@ import java.util.Objects;
* @since 5.8.12
*/
public enum FileMagicNumber {
+ /**
+ * 未知类型
+ */
UNKNOWN(null, null) {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return false;
}
},
- //image start---------------------------------------------
+ // region ----- image
+ /**
+ * jpeg
+ */
JPEG("image/jpeg", "jpg") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 2
&& Objects.equals(bytes[0], (byte) 0xff)
&& Objects.equals(bytes[1], (byte) 0xd8)
&& Objects.equals(bytes[2], (byte) 0xff);
}
},
+ /**
+ * jxr
+ */
JXR("image/vnd.ms-photo", "jxr") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
//file magic number https://www.iana.org/assignments/media-types/image/jxr
return bytes.length > 2
&& Objects.equals(bytes[0], (byte) 0x49)
@@ -39,10 +48,13 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[2], (byte) 0xbc);
}
},
+ /**
+ * apng
+ */
APNG("image/apng", "apng") {
@Override
- public boolean match(byte[] bytes) {
- boolean b = bytes.length > 8
+ public boolean match(final byte[] bytes) {
+ final boolean b = bytes.length > 8
&& Objects.equals(bytes[0], (byte) 0x89)
&& Objects.equals(bytes[1], (byte) 0x50)
&& Objects.equals(bytes[2], (byte) 0x4e)
@@ -56,10 +68,10 @@ public enum FileMagicNumber {
int i = 8;
while (i < bytes.length) {
try {
- int dataLength = new BigInteger(1, Arrays.copyOfRange(bytes, i, i + 4)).intValue();
+ final int dataLength = new BigInteger(1, Arrays.copyOfRange(bytes, i, i + 4)).intValue();
i += 4;
- byte[] bytes1 = Arrays.copyOfRange(bytes, i, i + 4);
- String chunkType = new String(bytes1);
+ final byte[] bytes1 = Arrays.copyOfRange(bytes, i, i + 4);
+ final String chunkType = new String(bytes1);
i += 4;
if (Objects.equals(chunkType, "IDAT") || Objects.equals(chunkType, "IEND")) {
return false;
@@ -67,7 +79,7 @@ public enum FileMagicNumber {
return true;
}
i += dataLength + 4;
- } catch (Exception e) {
+ } catch (final Exception e) {
return false;
}
}
@@ -75,9 +87,12 @@ public enum FileMagicNumber {
return false;
}
},
+ /**
+ * png
+ */
PNG("image/png", "png") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x89)
&& Objects.equals(bytes[1], (byte) 0x50)
@@ -85,34 +100,43 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x47);
}
},
+ /**
+ * gif
+ */
GIF("image/gif", "gif") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 2
&& Objects.equals(bytes[0], (byte) 0x47)
&& Objects.equals(bytes[1], (byte) 0x49)
&& Objects.equals(bytes[2], (byte) 0x46);
}
},
+ /**
+ * bmp
+ */
BMP("image/bmp", "bmp") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 1
&& Objects.equals(bytes[0], (byte) 0x42)
&& Objects.equals(bytes[1], (byte) 0x4d);
}
},
+ /**
+ * tiff
+ */
TIFF("image/tiff", "tiff") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 4) {
return false;
}
- boolean flag1 = Objects.equals(bytes[0], (byte) 0x49)
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0x49)
&& Objects.equals(bytes[1], (byte) 0x49)
&& Objects.equals(bytes[2], (byte) 0x2a)
&& Objects.equals(bytes[3], (byte) 0x00);
- boolean flag2 = (Objects.equals(bytes[0], (byte) 0x4d)
+ final boolean flag2 = (Objects.equals(bytes[0], (byte) 0x4d)
&& Objects.equals(bytes[1], (byte) 0x4d)
&& Objects.equals(bytes[2], (byte) 0x00)
&& Objects.equals(bytes[3], (byte) 0x2a));
@@ -120,10 +144,12 @@ public enum FileMagicNumber {
}
},
-
+ /**
+ * dwg
+ */
DWG("image/vnd.dwg", "dwg") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 10
&& Objects.equals(bytes[0], (byte) 0x41)
&& Objects.equals(bytes[1], (byte) 0x43)
@@ -131,10 +157,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x30);
}
},
-
+ /**
+ * webp
+ */
WEBP("image/webp", "webp") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 11
&& Objects.equals(bytes[8], (byte) 0x57)
&& Objects.equals(bytes[9], (byte) 0x45)
@@ -142,9 +170,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[11], (byte) 0x50);
}
},
+ /**
+ * psd
+ */
PSD("image/vnd.adobe.photoshop", "psd") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x38)
&& Objects.equals(bytes[1], (byte) 0x42)
@@ -152,9 +183,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x53);
}
},
+ /**
+ * icon
+ */
ICO("image/x-icon", "ico") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x00)
&& Objects.equals(bytes[1], (byte) 0x00)
@@ -162,9 +196,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x00);
}
},
+ /**
+ * xcf
+ */
XCF("image/x-xcf", "xcf") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 9
&& Objects.equals(bytes[0], (byte) 0x67)
&& Objects.equals(bytes[1], (byte) 0x69)
@@ -178,13 +215,15 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[9], (byte) 0x76);
}
},
- //image end-----------------------------------------------
-
- //audio start---------------------------------------------
+ // endregion
+ // region ----- audio
+ /**
+ * wav
+ */
WAV("audio/x-wav", "wav") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 11
&& Objects.equals(bytes[0], (byte) 0x52)
&& Objects.equals(bytes[1], (byte) 0x49)
@@ -196,9 +235,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[11], (byte) 0x45);
}
},
+ /**
+ * midi
+ */
MIDI("audio/midi", "midi") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x4d)
&& Objects.equals(bytes[1], (byte) 0x54)
@@ -206,22 +248,28 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x64);
}
},
+ /**
+ * mpeg-mp3
+ */
MP3("audio/mpeg", "mp3") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 2) {
return false;
}
- boolean flag1 = Objects.equals(bytes[0], (byte) 0x49) && Objects.equals(bytes[1], (byte) 0x44) && Objects.equals(bytes[2], (byte) 0x33);
- boolean flag2 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xFB);
- boolean flag3 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF3);
- boolean flag4 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF2);
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0x49) && Objects.equals(bytes[1], (byte) 0x44) && Objects.equals(bytes[2], (byte) 0x33);
+ final boolean flag2 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xFB);
+ final boolean flag3 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF3);
+ final boolean flag4 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF2);
return flag1 || flag2 || flag3 || flag4;
}
},
+ /**
+ * ogg
+ */
OGG("audio/ogg", "ogg") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x4f)
&& Objects.equals(bytes[1], (byte) 0x67)
@@ -229,9 +277,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x53);
}
},
+ /**
+ * flac
+ */
FLAC("audio/x-flac", "flac") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x66)
&& Objects.equals(bytes[1], (byte) 0x4c)
@@ -239,9 +290,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x43);
}
},
+ /**
+ * mp4
+ */
M4A("audio/mp4", "m4a") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return (bytes.length > 10
&& Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x74)
@@ -256,32 +310,38 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x20));
}
},
+ /**
+ * aac
+ */
AAC("audio/aac", "aac") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 1) {
return false;
}
- boolean flag1 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF1);
- boolean flag2 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF9);
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF1);
+ final boolean flag2 = Objects.equals(bytes[0], (byte) 0xFF) && Objects.equals(bytes[1], (byte) 0xF9);
return flag1 || flag2;
}
},
+ /**
+ * amr
+ */
AMR("audio/amr", "amr") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
//single-channel
if (bytes.length < 11) {
return false;
}
- boolean flag1 = Objects.equals(bytes[0], (byte) 0x23)
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0x23)
&& Objects.equals(bytes[1], (byte) 0x21)
&& Objects.equals(bytes[2], (byte) 0x41)
&& Objects.equals(bytes[3], (byte) 0x4d)
&& Objects.equals(bytes[4], (byte) 0x52)
&& Objects.equals(bytes[5], (byte) 0x0A);
//multi-channel:
- boolean flag2 = Objects.equals(bytes[0], (byte) 0x23)
+ final boolean flag2 = Objects.equals(bytes[0], (byte) 0x23)
&& Objects.equals(bytes[1], (byte) 0x21)
&& Objects.equals(bytes[2], (byte) 0x41)
&& Objects.equals(bytes[3], (byte) 0x4d)
@@ -296,17 +356,23 @@ public enum FileMagicNumber {
return flag1 || flag2;
}
},
+ /**
+ * ac3
+ */
AC3("audio/ac3", "ac3") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 2
&& Objects.equals(bytes[0], (byte) 0x0b)
&& Objects.equals(bytes[1], (byte) 0x77);
}
},
+ /**
+ * aiff
+ */
AIFF("audio/x-aiff", "aiff") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 11
&& Objects.equals(bytes[0], (byte) 0x46)
&& Objects.equals(bytes[1], (byte) 0x4f)
@@ -318,26 +384,29 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[11], (byte) 0x46);
}
},
- //audio end-----------------------------------------------
+ // endregion
- //font start---------------------------------------------
- // The existing registration "application/font-woff" is deprecated in favor of "font/woff".
+ // region ----- font
+ /**
+ * woff
+ * The existing registration "application/font-woff" is deprecated in favor of "font/woff".
+ */
WOFF("font/woff", "woff") {
@Override
- public boolean match(byte[] bytes) {
- boolean flag1 = Objects.equals(bytes[0], (byte) 0x77)
+ public boolean match(final byte[] bytes) {
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0x77)
&& Objects.equals(bytes[1], (byte) 0x4f)
&& Objects.equals(bytes[2], (byte) 0x46)
&& Objects.equals(bytes[3], (byte) 0x46);
- boolean flag2 = Objects.equals(bytes[4], (byte) 0x00)
+ final boolean flag2 = Objects.equals(bytes[4], (byte) 0x00)
&& Objects.equals(bytes[5], (byte) 0x01)
&& Objects.equals(bytes[6], (byte) 0x00)
&& Objects.equals(bytes[7], (byte) 0x00);
- boolean flag3 = Objects.equals(bytes[4], (byte) 0x4f)
+ final boolean flag3 = Objects.equals(bytes[4], (byte) 0x4f)
&& Objects.equals(bytes[5], (byte) 0x54)
&& Objects.equals(bytes[6], (byte) 0x54)
&& Objects.equals(bytes[7], (byte) 0x4f);
- boolean flag4 = Objects.equals(bytes[4], (byte) 0x74)
+ final boolean flag4 = Objects.equals(bytes[4], (byte) 0x74)
&& Objects.equals(bytes[5], (byte) 0x72)
&& Objects.equals(bytes[6], (byte) 0x75)
&& Objects.equals(bytes[7], (byte) 0x65);
@@ -345,22 +414,25 @@ public enum FileMagicNumber {
&& (flag1 && (flag2 || flag3 || flag4));
}
},
+ /**
+ * woff2
+ */
WOFF2("font/woff2", "woff2") {
@Override
- public boolean match(byte[] bytes) {
- boolean flag1 = Objects.equals(bytes[0], (byte) 0x77)
+ public boolean match(final byte[] bytes) {
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0x77)
&& Objects.equals(bytes[1], (byte) 0x4f)
&& Objects.equals(bytes[2], (byte) 0x46)
&& Objects.equals(bytes[3], (byte) 0x32);
- boolean flag2 = Objects.equals(bytes[4], (byte) 0x00)
+ final boolean flag2 = Objects.equals(bytes[4], (byte) 0x00)
&& Objects.equals(bytes[5], (byte) 0x01)
&& Objects.equals(bytes[6], (byte) 0x00)
&& Objects.equals(bytes[7], (byte) 0x00);
- boolean flag3 = Objects.equals(bytes[4], (byte) 0x4f)
+ final boolean flag3 = Objects.equals(bytes[4], (byte) 0x4f)
&& Objects.equals(bytes[5], (byte) 0x54)
&& Objects.equals(bytes[6], (byte) 0x54)
&& Objects.equals(bytes[7], (byte) 0x4f);
- boolean flag4 = Objects.equals(bytes[4], (byte) 0x74)
+ final boolean flag4 = Objects.equals(bytes[4], (byte) 0x74)
&& Objects.equals(bytes[5], (byte) 0x72)
&& Objects.equals(bytes[6], (byte) 0x75)
&& Objects.equals(bytes[7], (byte) 0x65);
@@ -368,9 +440,12 @@ public enum FileMagicNumber {
&& (flag1 && (flag2 || flag3 || flag4));
}
},
+ /**
+ * ttf
+ */
TTF("font/ttf", "ttf") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 4
&& Objects.equals(bytes[0], (byte) 0x00)
&& Objects.equals(bytes[1], (byte) 0x01)
@@ -379,9 +454,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[4], (byte) 0x00);
}
},
+ /**
+ * otf
+ */
OTF("font/otf", "otf") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 4
&& Objects.equals(bytes[0], (byte) 0x4f)
&& Objects.equals(bytes[1], (byte) 0x54)
@@ -390,13 +468,15 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[4], (byte) 0x00);
}
},
+ // endregion
- //font end-----------------------------------------------
-
- //archive start-----------------------------------------
+ // region ----- archive
+ /**
+ * epub
+ */
EPUB("application/epub+zip", "epub") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 58
&& Objects.equals(bytes[0], (byte) 0x50) && Objects.equals(bytes[1], (byte) 0x4b)
&& Objects.equals(bytes[2], (byte) 0x03) && Objects.equals(bytes[3], (byte) 0x04)
@@ -416,21 +496,27 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[56], (byte) 0x69) && Objects.equals(bytes[57], (byte) 0x70);
}
},
+ /**
+ * zip
+ */
ZIP("application/zip", "zip") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 4) {
return false;
}
- boolean flag1 = Objects.equals(bytes[0], (byte) 0x50) && Objects.equals(bytes[1], (byte) 0x4b);
- boolean flag2 = Objects.equals(bytes[2], (byte) 0x03) || Objects.equals(bytes[2], (byte) 0x05) || Objects.equals(bytes[2], (byte) 0x07);
- boolean flag3 = Objects.equals(bytes[3], (byte) 0x04) || Objects.equals(bytes[3], (byte) 0x06) || Objects.equals(bytes[3], (byte) 0x08);
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0x50) && Objects.equals(bytes[1], (byte) 0x4b);
+ final boolean flag2 = Objects.equals(bytes[2], (byte) 0x03) || Objects.equals(bytes[2], (byte) 0x05) || Objects.equals(bytes[2], (byte) 0x07);
+ final boolean flag3 = Objects.equals(bytes[3], (byte) 0x04) || Objects.equals(bytes[3], (byte) 0x06) || Objects.equals(bytes[3], (byte) 0x08);
return flag1 && flag2 && flag3;
}
},
+ /**
+ * tar
+ */
TAR("application/x-tar", "tar") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 261
&& Objects.equals(bytes[257], (byte) 0x75)
&& Objects.equals(bytes[258], (byte) 0x73)
@@ -439,9 +525,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[261], (byte) 0x72);
}
},
+ /**
+ * rar
+ */
RAR("application/x-rar-compressed", "rar") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 6
&& Objects.equals(bytes[0], (byte) 0x52)
&& Objects.equals(bytes[1], (byte) 0x61)
@@ -452,27 +541,36 @@ public enum FileMagicNumber {
&& (Objects.equals(bytes[6], (byte) 0x00) || Objects.equals(bytes[6], (byte) 0x01));
}
},
+ /**
+ * gz
+ */
GZ("application/gzip", "gz") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 2
&& Objects.equals(bytes[0], (byte) 0x1f)
&& Objects.equals(bytes[1], (byte) 0x8b)
&& Objects.equals(bytes[2], (byte) 0x08);
}
},
+ /**
+ * bz2
+ */
BZ2("application/x-bzip2", "bz2") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 2
&& Objects.equals(bytes[0], (byte) 0x42)
&& Objects.equals(bytes[1], (byte) 0x5a)
&& Objects.equals(bytes[2], (byte) 0x68);
}
},
+ /**
+ * 7z
+ */
SevenZ("application/x-7z-compressed", "7z") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 6
&& Objects.equals(bytes[0], (byte) 0x37)
&& Objects.equals(bytes[1], (byte) 0x7a)
@@ -483,6 +581,9 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[6], (byte) 0x00);
}
},
+ /**
+ * pdf
+ */
PDF("application/pdf", "pdf") {
@Override
public boolean match(byte[] bytes) {
@@ -498,26 +599,35 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x46);
}
},
+ /**
+ * exe
+ */
EXE("application/x-msdownload", "exe") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 1
&& Objects.equals(bytes[0], (byte) 0x4d)
&& Objects.equals(bytes[1], (byte) 0x5a);
}
},
+ /**
+ * swf
+ */
SWF("application/x-shockwave-flash", "swf") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 2
&& (Objects.equals(bytes[0], 0x43) || Objects.equals(bytes[0], (byte) 0x46))
&& Objects.equals(bytes[1], (byte) 0x57)
&& Objects.equals(bytes[2], (byte) 0x53);
}
},
+ /**
+ * rtf
+ */
RTF("application/rtf", "rtf") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 4
&& Objects.equals(bytes[0], (byte) 0x7b)
&& Objects.equals(bytes[1], (byte) 0x5c)
@@ -526,9 +636,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[4], (byte) 0x66);
}
},
+ /**
+ * nes
+ */
NES("application/x-nintendo-nes-rom", "nes") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x4e)
&& Objects.equals(bytes[1], (byte) 0x45)
@@ -536,9 +649,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x1a);
}
},
+ /**
+ * crx
+ */
CRX("application/x-google-chrome-extension", "crx") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x43)
&& Objects.equals(bytes[1], (byte) 0x72)
@@ -546,30 +662,39 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x34);
}
},
+ /**
+ * cab
+ */
CAB("application/vnd.ms-cab-compressed", "cab") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 4) {
return false;
}
- boolean flag1 = Objects.equals(bytes[0], (byte) 0x4d) && Objects.equals(bytes[1], (byte) 0x53)
+ final boolean flag1 = Objects.equals(bytes[0], (byte) 0x4d) && Objects.equals(bytes[1], (byte) 0x53)
&& Objects.equals(bytes[2], (byte) 0x43) && Objects.equals(bytes[3], (byte) 0x46);
- boolean flag2 = Objects.equals(bytes[0], (byte) 0x49) && Objects.equals(bytes[1], (byte) 0x53)
+ final boolean flag2 = Objects.equals(bytes[0], (byte) 0x49) && Objects.equals(bytes[1], (byte) 0x53)
&& Objects.equals(bytes[2], (byte) 0x63) && Objects.equals(bytes[3], (byte) 0x28);
return flag1 || flag2;
}
},
+ /**
+ * ps
+ */
PS("application/postscript", "ps") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 1
&& Objects.equals(bytes[0], (byte) 0x25)
&& Objects.equals(bytes[1], (byte) 0x21);
}
},
+ /**
+ * xz
+ */
XZ("application/x-xz", "xz") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 5
&& Objects.equals(bytes[0], (byte) 0xFD)
&& Objects.equals(bytes[1], (byte) 0x37)
@@ -579,9 +704,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[5], (byte) 0x00);
}
},
+ /**
+ * sqlite
+ */
SQLITE("application/x-sqlite3", "sqlite") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 15
&& Objects.equals(bytes[0], (byte) 0x53) && Objects.equals(bytes[1], (byte) 0x51)
&& Objects.equals(bytes[2], (byte) 0x4c) && Objects.equals(bytes[3], (byte) 0x69)
@@ -593,9 +721,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[14], (byte) 0x33) && Objects.equals(bytes[15], (byte) 0x00);
}
},
+ /**
+ * deb
+ */
DEB("application/x-deb", "deb") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 20
&& Objects.equals(bytes[0], (byte) 0x21) && Objects.equals(bytes[1], (byte) 0x3c)
&& Objects.equals(bytes[2], (byte) 0x61) && Objects.equals(bytes[3], (byte) 0x72)
@@ -610,9 +741,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[20], (byte) 0x79);
}
},
+ /**
+ * ar
+ */
AR("application/x-unix-archive", "ar") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 6
&& Objects.equals(bytes[0], (byte) 0x21)
&& Objects.equals(bytes[1], (byte) 0x3c)
@@ -623,9 +757,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[6], (byte) 0x3e);
}
},
+ /**
+ * lzo
+ */
LZOP("application/x-lzop", "lzo") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 7
&& Objects.equals(bytes[0], (byte) 0x89)
&& Objects.equals(bytes[1], (byte) 0x4c)
@@ -637,9 +774,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[7], (byte) 0x1a);
}
},
+ /**
+ * lz
+ */
LZ("application/x-lzip", "lz") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x4c)
&& Objects.equals(bytes[1], (byte) 0x5a)
@@ -647,9 +787,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x50);
}
},
+ /**
+ * elf
+ */
ELF("application/x-executable", "elf") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 52
&& Objects.equals(bytes[0], (byte) 0x7f)
&& Objects.equals(bytes[1], (byte) 0x45)
@@ -657,9 +800,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x46);
}
},
+ /**
+ * lz4
+ */
LZ4("application/x-lz4", "lz4") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 4
&& Objects.equals(bytes[0], (byte) 0x04)
&& Objects.equals(bytes[1], (byte) 0x22)
@@ -667,10 +813,13 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x18);
}
},
- //https://github.com/madler/brotli/blob/master/br-format-v3.txt,brotli 没有固定的file magic number,所以此处只是参考
+ /**
+ * br
+ * https://github.com/madler/brotli/blob/master/br-format-v3.txt,brotli 没有固定的file magic number,所以此处只是参考
+ */
BR("application/x-brotli", "br") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0xce)
&& Objects.equals(bytes[1], (byte) 0xb2)
@@ -678,9 +827,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x81);
}
},
+ /**
+ * dcm
+ */
DCM("application/x-dicom", "dcm") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 128
&& Objects.equals(bytes[128], (byte) 0x44)
&& Objects.equals(bytes[129], (byte) 0x49)
@@ -688,9 +840,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[131], (byte) 0x4d);
}
},
+ /**
+ * rpm
+ */
RPM("application/x-rpm", "rpm") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 4
&& Objects.equals(bytes[0], (byte) 0xed)
&& Objects.equals(bytes[1], (byte) 0xab)
@@ -698,15 +853,18 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0xdb);
}
},
+ /**
+ * zst
+ */
ZSTD("application/x-zstd", "zst") {
@Override
- public boolean match(byte[] bytes) {
- int length = bytes.length;
+ public boolean match(final byte[] bytes) {
+ final int length = bytes.length;
if (length < 5) {
return false;
}
- byte[] buf1 = new byte[]{(byte) 0x22, (byte) 0x23, (byte) 0x24, (byte) 0x25, (byte) 0x26, (byte) 0x27, (byte) 0x28};
- boolean flag1 = ArrayUtil.contains(buf1, bytes[0])
+ final byte[] buf1 = new byte[]{(byte) 0x22, (byte) 0x23, (byte) 0x24, (byte) 0x25, (byte) 0x26, (byte) 0x27, (byte) 0x28};
+ final boolean flag1 = ArrayUtil.contains(buf1, bytes[0])
&& Objects.equals(bytes[1], (byte) 0xb5)
&& Objects.equals(bytes[2], (byte) 0x2f)
&& Objects.equals(bytes[3], (byte) 0xfd);
@@ -719,15 +877,19 @@ public enum FileMagicNumber {
return false;
}
},
- //archive end------------------------------------------------------------
- //video start------------------------------------------------------------
+ // endregion
+
+ // region ----- video
+ /**
+ * mp4
+ */
MP4("video/mp4", "mp4") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 13) {
return false;
}
- boolean flag1 = Objects.equals(bytes[4], (byte) 0x66)
+ final boolean flag1 = Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x74)
&& Objects.equals(bytes[6], (byte) 0x79)
&& Objects.equals(bytes[7], (byte) 0x70)
@@ -735,7 +897,7 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[9], (byte) 0x53)
&& Objects.equals(bytes[10], (byte) 0x4e)
&& Objects.equals(bytes[11], (byte) 0x56);
- boolean flag2 = Objects.equals(bytes[4], (byte) 0x66)
+ final boolean flag2 = Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x74)
&& Objects.equals(bytes[6], (byte) 0x79)
&& Objects.equals(bytes[7], (byte) 0x70)
@@ -746,9 +908,12 @@ public enum FileMagicNumber {
return flag1 || flag2;
}
},
+ /**
+ * avi
+ */
AVI("video/x-msvideo", "avi") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 11
&& Objects.equals(bytes[0], (byte) 0x52)
&& Objects.equals(bytes[1], (byte) 0x49)
@@ -760,9 +925,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[11], (byte) 0x20);
}
},
+ /**
+ * wmv
+ */
WMV("video/x-ms-wmv", "wmv") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 9
&& Objects.equals(bytes[0], (byte) 0x30)
&& Objects.equals(bytes[1], (byte) 0x26)
@@ -776,13 +944,16 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[9], (byte) 0xd9);
}
},
+ /**
+ * m4v
+ */
M4V("video/x-m4v", "m4v") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 12) {
return false;
}
- boolean flag1 = Objects.equals(bytes[4], (byte) 0x66)
+ final boolean flag1 = Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x74)
&& Objects.equals(bytes[6], (byte) 0x79)
&& Objects.equals(bytes[7], (byte) 0x70)
@@ -790,7 +961,7 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[9], (byte) 0x34)
&& Objects.equals(bytes[10], (byte) 0x56)
&& Objects.equals(bytes[11], (byte) 0x20);
- boolean flag2 = Objects.equals(bytes[4], (byte) 0x66)
+ final boolean flag2 = Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x74)
&& Objects.equals(bytes[6], (byte) 0x79)
&& Objects.equals(bytes[7], (byte) 0x70)
@@ -801,9 +972,12 @@ public enum FileMagicNumber {
return flag1 || flag2;
}
},
+ /**
+ * flv
+ */
FLV("video/x-flv", "flv") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x46)
&& Objects.equals(bytes[1], (byte) 0x4c)
@@ -811,11 +985,14 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x01);
}
},
+ /**
+ * mkv
+ */
MKV("video/x-matroska", "mkv") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
//0x42 0x82 0x88 0x6d 0x61 0x74 0x72 0x6f 0x73 0x6b 0x61
- boolean flag1 = bytes.length > 11
+ final boolean flag1 = bytes.length > 11
&& Objects.equals(bytes[0], (byte) 0x1a)
&& Objects.equals(bytes[1], (byte) 0x45)
&& Objects.equals(bytes[2], (byte) 0xdf)
@@ -823,39 +1000,44 @@ public enum FileMagicNumber {
if (flag1) {
//此处需要判断是否是'\x42\x82\x88matroska',算法类似kmp判断
- byte[] bytes1 = {(byte) 0x42, (byte) 0x82, (byte) 0x88, (byte) 0x6d, (byte) 0x61, (byte) 0x74, (byte) 0x72, (byte) 0x6f, (byte) 0x73, (byte) 0x6b, (byte) 0x61};
- int index = FileMagicNumber.indexOf(bytes, bytes1);
+ final byte[] bytes1 = {(byte) 0x42, (byte) 0x82, (byte) 0x88, (byte) 0x6d, (byte) 0x61, (byte) 0x74, (byte) 0x72, (byte) 0x6f, (byte) 0x73, (byte) 0x6b, (byte) 0x61};
+ final int index = FileMagicNumber.indexOf(bytes, bytes1);
return index > 0;
}
return false;
}
},
-
+ /**
+ * webm
+ */
WEBM("video/webm", "webm") {
@Override
- public boolean match(byte[] bytes) {
- boolean flag1 = bytes.length > 8
+ public boolean match(final byte[] bytes) {
+ final boolean flag1 = bytes.length > 8
&& Objects.equals(bytes[0], (byte) 0x1a)
&& Objects.equals(bytes[1], (byte) 0x45)
&& Objects.equals(bytes[2], (byte) 0xdf)
&& Objects.equals(bytes[3], (byte) 0xa3);
if (flag1) {
//此处需要判断是否是'\x42\x82\x88webm',算法类似kmp判断
- byte[] bytes1 = {(byte) 0x42, (byte) 0x82, (byte) 0x88, (byte) 0x77, (byte) 0x65, (byte) 0x62, (byte) 0x6d};
- int index = FileMagicNumber.indexOf(bytes, bytes1);
+ final byte[] bytes1 = {(byte) 0x42, (byte) 0x82, (byte) 0x88, (byte) 0x77, (byte) 0x65, (byte) 0x62, (byte) 0x6d};
+ final int index = FileMagicNumber.indexOf(bytes, bytes1);
return index > 0;
}
return false;
}
},
- //此文件签名非常复杂,只判断常见的几种
+ /**
+ * mov
+ * 此文件签名非常复杂,只判断常见的几种
+ */
MOV("video/quicktime", "mov") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 12) {
return false;
}
- boolean flag1 = Objects.equals(bytes[4], (byte) 0x66)
+ final boolean flag1 = Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x74)
&& Objects.equals(bytes[6], (byte) 0x79)
&& Objects.equals(bytes[7], (byte) 0x70)
@@ -863,36 +1045,39 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[9], (byte) 0x74)
&& Objects.equals(bytes[10], (byte) 0x20)
&& Objects.equals(bytes[11], (byte) 0x20);
- boolean flag2 = Objects.equals(bytes[4], (byte) 0x6D)
+ final boolean flag2 = Objects.equals(bytes[4], (byte) 0x6D)
&& Objects.equals(bytes[5], (byte) 0x6F)
&& Objects.equals(bytes[6], (byte) 0x6F)
&& Objects.equals(bytes[7], (byte) 0x76);
- boolean flag3 = Objects.equals(bytes[4], (byte) 0x66)
+ final boolean flag3 = Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x72)
&& Objects.equals(bytes[6], (byte) 0x65)
&& Objects.equals(bytes[7], (byte) 0x65);
- boolean flag4 = Objects.equals(bytes[4], (byte) 0x6D)
+ final boolean flag4 = Objects.equals(bytes[4], (byte) 0x6D)
&& Objects.equals(bytes[5], (byte) 0x64)
&& Objects.equals(bytes[6], (byte) 0x61)
&& Objects.equals(bytes[7], (byte) 0x74);
- boolean flag5 = Objects.equals(bytes[4], (byte) 0x77)
+ final boolean flag5 = Objects.equals(bytes[4], (byte) 0x77)
&& Objects.equals(bytes[5], (byte) 0x69)
&& Objects.equals(bytes[6], (byte) 0x64)
&& Objects.equals(bytes[7], (byte) 0x65);
- boolean flag6 = Objects.equals(bytes[4], (byte) 0x70)
+ final boolean flag6 = Objects.equals(bytes[4], (byte) 0x70)
&& Objects.equals(bytes[5], (byte) 0x6E)
&& Objects.equals(bytes[6], (byte) 0x6F)
&& Objects.equals(bytes[7], (byte) 0x74);
- boolean flag7 = Objects.equals(bytes[4], (byte) 0x73)
+ final boolean flag7 = Objects.equals(bytes[4], (byte) 0x73)
&& Objects.equals(bytes[5], (byte) 0x6B)
&& Objects.equals(bytes[6], (byte) 0x69)
&& Objects.equals(bytes[7], (byte) 0x70);
return flag1 || flag2 || flag3 || flag4 || flag5 || flag6 || flag7;
}
},
+ /**
+ * mpg
+ */
MPEG("video/mpeg", "mpg") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 3
&& Objects.equals(bytes[0], (byte) 0x00)
&& Objects.equals(bytes[1], (byte) 0x00)
@@ -900,9 +1085,12 @@ public enum FileMagicNumber {
&& (bytes[3] >= (byte) 0xb0 && bytes[3] <= (byte) 0xbf);
}
},
+ /**
+ * rmvb
+ */
RMVB("video/vnd.rn-realvideo", "rmvb") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 4
&& Objects.equals(bytes[0], (byte) 0x2E)
&& Objects.equals(bytes[1], (byte) 0x52)
@@ -910,9 +1098,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[3], (byte) 0x46);
}
},
+ /**
+ * 3gp
+ */
M3GP("video/3gpp", "3gp") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 10
&& Objects.equals(bytes[4], (byte) 0x66)
&& Objects.equals(bytes[5], (byte) 0x74)
@@ -923,94 +1114,115 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[10], (byte) 0x70);
}
},
- //video end ---------------------------------------------------------------
- //document start ----------------------------------------------------------
+ // endregion
+
+ // region ----- document
+ /**
+ * doc
+ */
DOC("application/msword", "doc") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0xd0, (byte) 0xcf, (byte) 0x11, (byte) 0xe0, (byte) 0xa1, (byte) 0xb1, (byte) 0x1a, (byte) 0xe1};
- boolean flag1 = bytes.length > 515 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte1);
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0xd0, (byte) 0xcf, (byte) 0x11, (byte) 0xe0, (byte) 0xa1, (byte) 0xb1, (byte) 0x1a, (byte) 0xe1};
+ final boolean flag1 = bytes.length > 515 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte1);
if (flag1) {
- byte[] byte2 = new byte[]{(byte) 0xec, (byte) 0xa5, (byte) 0xc1, (byte) 0x00};
- boolean flag2 = Arrays.equals(Arrays.copyOfRange(bytes, 512, 516), byte2);
- byte[] byte3 = new byte[]{(byte) 0x00, (byte) 0x0a, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x4d, (byte) 0x53, (byte) 0x57, (byte) 0x6f, (byte) 0x72, (byte) 0x64
+ final byte[] byte2 = new byte[]{(byte) 0xec, (byte) 0xa5, (byte) 0xc1, (byte) 0x00};
+ final boolean flag2 = Arrays.equals(Arrays.copyOfRange(bytes, 512, 516), byte2);
+ final byte[] byte3 = new byte[]{(byte) 0x00, (byte) 0x0a, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x4d, (byte) 0x53, (byte) 0x57, (byte) 0x6f, (byte) 0x72, (byte) 0x64
, (byte) 0x44, (byte) 0x6f, (byte) 0x63, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x57, (byte) 0x6f, (byte) 0x72, (byte) 0x64,
(byte) 0x2e, (byte) 0x44, (byte) 0x6f, (byte) 0x63, (byte) 0x75, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x2e, (byte) 0x38, (byte) 0x00,
(byte) 0xf4, (byte) 0x39, (byte) 0xb2, (byte) 0x71};
- byte[] range = Arrays.copyOfRange(bytes, 2075, 2142);
- boolean flag3 = bytes.length > 2142 && FileMagicNumber.indexOf(range, byte3) > 0;
+ final byte[] range = Arrays.copyOfRange(bytes, 2075, 2142);
+ final boolean flag3 = bytes.length > 2142 && FileMagicNumber.indexOf(range, byte3) > 0;
return flag2 || flag3;
}
return false;
}
},
-
+ /**
+ * xls
+ */
XLS("application/vnd.ms-excel", "xls") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0xd0, (byte) 0xcf, (byte) 0x11, (byte) 0xe0, (byte) 0xa1, (byte) 0xb1, (byte) 0x1a, (byte) 0xe1};
- boolean flag1 = bytes.length > 520 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte1);
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0xd0, (byte) 0xcf, (byte) 0x11, (byte) 0xe0, (byte) 0xa1, (byte) 0xb1, (byte) 0x1a, (byte) 0xe1};
+ final boolean flag1 = bytes.length > 520 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte1);
if (flag1) {
- byte[] byte2 = new byte[]{(byte) 0xfd, (byte) 0xff, (byte) 0xff, (byte) 0xff};
- boolean flag2 = Arrays.equals(Arrays.copyOfRange(bytes, 512, 516), byte2) && (bytes[518] == 0x00 || bytes[518] == 0x02);
- byte[] byte3 = new byte[]{(byte) 0x09, (byte) 0x08, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x06, (byte) 0x05, (byte) 0x00};
- boolean flag3 = Arrays.equals(Arrays.copyOfRange(bytes, 512, 520), byte3);
- byte[] byte4 = new byte[]{(byte) 0xe2, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x5c, (byte) 0x00, (byte) 0x70, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x43, (byte) 0x61, (byte) 0x6c, (byte) 0x63};
- boolean flag4 = bytes.length > 2095 && Arrays.equals(Arrays.copyOfRange(bytes, 1568, 2095), byte4);
+ final byte[] byte2 = new byte[]{(byte) 0xfd, (byte) 0xff, (byte) 0xff, (byte) 0xff};
+ final boolean flag2 = Arrays.equals(Arrays.copyOfRange(bytes, 512, 516), byte2) && (bytes[518] == 0x00 || bytes[518] == 0x02);
+ final byte[] byte3 = new byte[]{(byte) 0x09, (byte) 0x08, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x06, (byte) 0x05, (byte) 0x00};
+ final boolean flag3 = Arrays.equals(Arrays.copyOfRange(bytes, 512, 520), byte3);
+ final byte[] byte4 = new byte[]{(byte) 0xe2, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x5c, (byte) 0x00, (byte) 0x70, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x43, (byte) 0x61, (byte) 0x6c, (byte) 0x63};
+ final boolean flag4 = bytes.length > 2095 && Arrays.equals(Arrays.copyOfRange(bytes, 1568, 2095), byte4);
return flag2 || flag3 || flag4;
}
return false;
}
},
+ /**
+ * ppt
+ */
PPT("application/vnd.ms-powerpoint", "ppt") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0xd0, (byte) 0xcf, (byte) 0x11, (byte) 0xe0, (byte) 0xa1, (byte) 0xb1, (byte) 0x1a, (byte) 0xe1};
- boolean flag1 = bytes.length > 524 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte1);
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0xd0, (byte) 0xcf, (byte) 0x11, (byte) 0xe0, (byte) 0xa1, (byte) 0xb1, (byte) 0x1a, (byte) 0xe1};
+ final boolean flag1 = bytes.length > 524 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte1);
if (flag1) {
- byte[] byte2 = new byte[]{(byte) 0xa0, (byte) 0x46, (byte) 0x1d, (byte) 0xf0};
- byte[] byteRange = Arrays.copyOfRange(bytes, 512, 516);
- boolean flag2 = Arrays.equals(byteRange, byte2);
- byte[] byte3 = new byte[]{(byte) 0x00, (byte) 0x6e, (byte) 0x1e, (byte) 0xf0};
- boolean flag3 = Arrays.equals(byteRange, byte3);
- byte[] byte4 = new byte[]{(byte) 0x0f, (byte) 0x00, (byte) 0xe8, (byte) 0x03};
- boolean flag4 = Arrays.equals(byteRange, byte4);
- byte[] byte5 = new byte[]{(byte) 0xfd, (byte) 0xff, (byte) 0xff, (byte) 0xff};
- boolean flag5 = Arrays.equals(byteRange, byte5) && bytes[522] == 0x00 && bytes[523] == 0x00;
- byte[] byte6 = new byte[]{(byte) 0x00, (byte) 0xb9, (byte) 0x29, (byte) 0xe8, (byte) 0x11, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ final byte[] byte2 = new byte[]{(byte) 0xa0, (byte) 0x46, (byte) 0x1d, (byte) 0xf0};
+ final byte[] byteRange = Arrays.copyOfRange(bytes, 512, 516);
+ final boolean flag2 = Arrays.equals(byteRange, byte2);
+ final byte[] byte3 = new byte[]{(byte) 0x00, (byte) 0x6e, (byte) 0x1e, (byte) 0xf0};
+ final boolean flag3 = Arrays.equals(byteRange, byte3);
+ final byte[] byte4 = new byte[]{(byte) 0x0f, (byte) 0x00, (byte) 0xe8, (byte) 0x03};
+ final boolean flag4 = Arrays.equals(byteRange, byte4);
+ final byte[] byte5 = new byte[]{(byte) 0xfd, (byte) 0xff, (byte) 0xff, (byte) 0xff};
+ final boolean flag5 = Arrays.equals(byteRange, byte5) && bytes[522] == 0x00 && bytes[523] == 0x00;
+ final byte[] byte6 = new byte[]{(byte) 0x00, (byte) 0xb9, (byte) 0x29, (byte) 0xe8, (byte) 0x11, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x4d, (byte) 0x53, (byte) 0x20, (byte) 0x50, (byte) 0x6f, (byte) 0x77, (byte) 0x65, (byte) 0x72, (byte) 0x50, (byte)
0x6f, (byte) 0x69, (byte) 0x6e, (byte) 0x74, (byte) 0x20, (byte) 0x39, (byte) 0x37};
- boolean flag6 = bytes.length > 2096 && Arrays.equals(Arrays.copyOfRange(bytes, 2072, 2096), byte6);
+ final boolean flag6 = bytes.length > 2096 && Arrays.equals(Arrays.copyOfRange(bytes, 2072, 2096), byte6);
return flag2 || flag3 || flag4 || flag5 || flag6;
}
return false;
}
},
+ /**
+ * docx
+ */
DOCX("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return Objects.equals(FileMagicNumber.matchDocument(bytes), DOCX);
}
},
+ /**
+ * pptx
+ */
PPTX("application/vnd.openxmlformats-officedocument.presentationml.presentation", "pptx") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return Objects.equals(FileMagicNumber.matchDocument(bytes), PPTX);
}
},
+ /**
+ * xlsx
+ */
XLSX("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xlsx") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return Objects.equals(FileMagicNumber.matchDocument(bytes), XLSX);
}
},
+ // endregion
- //document end ------------------------------------------------------------
- //other start -------------------------------------------------------------
+ // region ----- others
+ /**
+ * wasm
+ */
WASM("application/wasm", "wasm") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 7
&& Objects.equals(bytes[0], (byte) 0x00)
&& Objects.equals(bytes[1], (byte) 0x61)
@@ -1022,10 +1234,13 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[7], (byte) 0x00);
}
},
- // https://source.android.com/devices/tech/dalvik/dex-format#dex-file-magic
+ /**
+ * dex
+ * https://source.android.com/devices/tech/dalvik/dex-format#dex-file-magic
+ */
DEX("application/vnd.android.dex", "dex") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 36
&& Objects.equals(bytes[0], (byte) 0x64)
&& Objects.equals(bytes[1], (byte) 0x65)
@@ -1034,9 +1249,12 @@ public enum FileMagicNumber {
&& Objects.equals(bytes[36], (byte) 0x70);
}
},
+ /**
+ * dey
+ */
DEY("application/vnd.android.dey", "dey") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
return bytes.length > 100
&& Objects.equals(bytes[0], (byte) 0x64)
&& Objects.equals(bytes[1], (byte) 0x65)
@@ -1045,113 +1263,172 @@ public enum FileMagicNumber {
DEX.match(Arrays.copyOfRange(bytes, 40, 100));
}
},
+ /**
+ * eml
+ */
EML("message/rfc822", "eml") {
@Override
- public boolean match(byte[] bytes) {
+ public boolean match(final byte[] bytes) {
if (bytes.length < 8) {
return false;
}
- byte[] byte1 = new byte[]{(byte) 0x46, (byte) 0x72, (byte) 0x6F, (byte) 0x6D, (byte) 0x20, (byte) 0x20, (byte) 0x20};
- byte[] byte2 = new byte[]{(byte) 0x46, (byte) 0x72, (byte) 0x6F, (byte) 0x6D, (byte) 0x20, (byte) 0x3F, (byte) 0x3F, (byte) 0x3F};
- byte[] byte3 = new byte[]{(byte) 0x46, (byte) 0x72, (byte) 0x6F, (byte) 0x6D, (byte) 0x3A, (byte) 0x20};
- byte[] byte4 = new byte[]{(byte) 0x52, (byte) 0x65, (byte) 0x74, (byte) 0x75, (byte) 0x72, (byte) 0x6E, (byte) 0x2D, (byte) 0x50, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x3A, (byte) 0x20};
+ final byte[] byte1 = new byte[]{(byte) 0x46, (byte) 0x72, (byte) 0x6F, (byte) 0x6D, (byte) 0x20, (byte) 0x20, (byte) 0x20};
+ final byte[] byte2 = new byte[]{(byte) 0x46, (byte) 0x72, (byte) 0x6F, (byte) 0x6D, (byte) 0x20, (byte) 0x3F, (byte) 0x3F, (byte) 0x3F};
+ final byte[] byte3 = new byte[]{(byte) 0x46, (byte) 0x72, (byte) 0x6F, (byte) 0x6D, (byte) 0x3A, (byte) 0x20};
+ final byte[] byte4 = new byte[]{(byte) 0x52, (byte) 0x65, (byte) 0x74, (byte) 0x75, (byte) 0x72, (byte) 0x6E, (byte) 0x2D, (byte) 0x50, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x3A, (byte) 0x20};
return Arrays.equals(Arrays.copyOfRange(bytes, 0, 7), byte1)
|| Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte2)
|| Arrays.equals(Arrays.copyOfRange(bytes, 0, 6), byte3)
|| bytes.length > 13 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 13), byte4);
}
},
+ /**
+ * mdb
+ */
MDB("application/vnd.ms-access", "mdb") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x6E, (byte) 0x64,
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x6E, (byte) 0x64,
(byte) 0x61, (byte) 0x72, (byte) 0x64, (byte) 0x20, (byte) 0x4A, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x44, (byte) 0x42};
return bytes.length > 18 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 18), byte1);
}
},
- //CHM 49 54 53 46
+ /**
+ * CHM 49 54 53 46
+ */
CHM("application/vnd.ms-htmlhelp", "chm") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0x49, (byte) 0x54, (byte) 0x53, (byte) 0x46};
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0x49, (byte) 0x54, (byte) 0x53, (byte) 0x46};
return bytes.length > 4 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 4), byte1);
}
},
- //class CA FE BA BE
+
+ /**
+ * class CA FE BA BE
+ */
CLASS("application/java-vm", "class") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE};
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE};
return bytes.length > 4 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 4), byte1);
}
},
- //torrent 64 38 3A 61 6E 6E 6F 75 6E 63 65
+ /**
+ * torrent 64 38 3A 61 6E 6E 6F 75 6E 63 65
+ */
TORRENT("application/x-bittorrent", "torrent") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0x64, (byte) 0x38, (byte) 0x3A, (byte) 0x61, (byte) 0x6E, (byte) 0x6E, (byte) 0x6F, (byte) 0x75, (byte) 0x6E, (byte) 0x63, (byte) 0x65};
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0x64, (byte) 0x38, (byte) 0x3A, (byte) 0x61, (byte) 0x6E, (byte) 0x6E, (byte) 0x6F, (byte) 0x75, (byte) 0x6E, (byte) 0x63, (byte) 0x65};
return bytes.length > 11 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 11), byte1);
}
},
+ /**
+ * wpd
+ */
WPD("application/vnd.wordperfect", "wpd") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0xFF, (byte) 0x57, (byte) 0x50, (byte) 0x43};
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0xFF, (byte) 0x57, (byte) 0x50, (byte) 0x43};
return bytes.length > 4 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 4), byte1);
}
},
+ /**
+ * dbx
+ */
DBX("", "dbx") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0xCF, (byte) 0xAD, (byte) 0x12, (byte) 0xFE};
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0xCF, (byte) 0xAD, (byte) 0x12, (byte) 0xFE};
return bytes.length > 4 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 4), byte1);
}
},
+ /**
+ * pst
+ */
PST("application/vnd.ms-outlook-pst", "pst") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0x21, (byte) 0x42, (byte) 0x44, (byte) 0x4E};
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0x21, (byte) 0x42, (byte) 0x44, (byte) 0x4E};
return bytes.length > 4 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 4), byte1);
}
},
+ /**
+ * ram
+ */
RAM("audio/x-pn-realaudio", "ram") {
@Override
- public boolean match(byte[] bytes) {
- byte[] byte1 = new byte[]{(byte) 0x2E, (byte) 0x72, (byte) 0x61, (byte) 0xFD, (byte) 0x00};
+ public boolean match(final byte[] bytes) {
+ final byte[] byte1 = new byte[]{(byte) 0x2E, (byte) 0x72, (byte) 0x61, (byte) 0xFD, (byte) 0x00};
return bytes.length > 5 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 5), byte1);
}
}
- //other end ---------------------------------------------------------------
+ // endregion
;
- private final String mimeType;
- private final String extension;
- FileMagicNumber(String mimeType, String extension) {
- this.mimeType = mimeType;
- this.extension = extension;
- }
-
- public static FileMagicNumber getMagicNumber(byte[] bytes) {
- FileMagicNumber number = Arrays.stream(values())
+ /**
+ * 根据给定的bytes,获取对应识别到的{@code FileMagicNumber}
+ *
+ * @param bytes bytes魔数
+ * @return {@code FileMagicNumber}
+ */
+ public static FileMagicNumber getMagicNumber(final byte[] bytes) {
+ final FileMagicNumber number = Arrays.stream(values())
.filter(fileMagicNumber -> fileMagicNumber.match(bytes))
.findFirst()
.orElse(UNKNOWN);
- if (number.equals(FileMagicNumber.ZIP)) {
- FileMagicNumber fn = FileMagicNumber.matchDocument(bytes);
+
+ // 压缩文档类型,如office或jar等
+ if (FileMagicNumber.ZIP.equals(number)) {
+ final FileMagicNumber fn = FileMagicNumber.matchDocument(bytes);
return fn == UNKNOWN ? ZIP : fn;
}
return number;
}
+ private final String mimeType;
+ private final String extension;
+
+ /**
+ * 构造
+ *
+ * @param mimeType 媒体类型
+ * @param extension 扩展名
+ */
+ FileMagicNumber(final String mimeType, final String extension) {
+ this.mimeType = mimeType;
+ this.extension = extension;
+ }
+
+ /**
+ * 获取媒体类型
+ *
+ * @return 媒体类型
+ */
public String getMimeType() {
return mimeType;
}
+ /**
+ * 获取扩展名
+ *
+ * @return 扩展名
+ */
public String getExtension() {
return extension;
}
- private static int indexOf(byte[] array, byte[] target) {
+ /**
+ * 是否匹配bytes
+ *
+ * @param bytes bytes
+ * @return 是否匹配
+ */
+ public abstract boolean match(byte[] bytes);
+
+ // region ----- private static methods
+ private static int indexOf(final byte[] array, final byte[] target) {
if (array == null || target == null || array.length < target.length) {
return -1;
}
@@ -1172,19 +1449,26 @@ public enum FileMagicNumber {
}
//处理 Open XML 类型的文件
- private static boolean compareBytes(byte[] buf, byte[] slice, int startOffset) {
- int sl = slice.length;
+ private static boolean compareBytes(final byte[] buf, final byte[] slice, final int startOffset) {
+ final int sl = slice.length;
if (startOffset + sl > buf.length) {
return false;
}
- byte[] sub = Arrays.copyOfRange(buf, startOffset, startOffset + sl);
+ final byte[] sub = Arrays.copyOfRange(buf, startOffset, startOffset + sl);
return Arrays.equals(sub, slice);
}
- private static FileMagicNumber matchOpenXmlMime(byte[] bytes, int offset) {
- byte[] word = new byte[]{'w', 'o', 'r', 'd', '/'};
- byte[] ppt = new byte[]{'p', 'p', 't', '/'};
- byte[] xl = new byte[]{'x', 'l', '/'};
+ /**
+ * 判断OpenXML文档类型
+ *
+ * @param bytes bytes魔数
+ * @param offset 偏移
+ * @return {@code FileMagicNumber}
+ */
+ private static FileMagicNumber matchOpenXmlMime(final byte[] bytes, final int offset) {
+ final byte[] word = new byte[]{'w', 'o', 'r', 'd', '/'};
+ final byte[] ppt = new byte[]{'p', 'p', 't', '/'};
+ final byte[] xl = new byte[]{'x', 'l', '/'};
if (FileMagicNumber.compareBytes(bytes, word, offset)) {
return FileMagicNumber.DOCX;
}
@@ -1197,17 +1481,23 @@ public enum FileMagicNumber {
return FileMagicNumber.UNKNOWN;
}
- private static FileMagicNumber matchDocument(byte[] bytes) {
- FileMagicNumber fileMagicNumber = FileMagicNumber.matchOpenXmlMime(bytes, (byte) 0x1e);
+ /**
+ * 匹配文档类型
+ *
+ * @param bytes bytes魔数
+ * @return 匹配到的文档类型
+ */
+ private static FileMagicNumber matchDocument(final byte[] bytes) {
+ final FileMagicNumber fileMagicNumber = FileMagicNumber.matchOpenXmlMime(bytes, (byte) 0x1e);
if (false == fileMagicNumber.equals(UNKNOWN)) {
return fileMagicNumber;
}
- byte[] bytes1 = new byte[]{0x5B, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x5F, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5D, 0x2E, 0x78, 0x6D, 0x6C};
- byte[] bytes2 = new byte[]{0x5F, 0x72, 0x65, 0x6C, 0x73, 0x2F, 0x2E, 0x72, 0x65, 0x6C, 0x73};
- byte[] bytes3 = new byte[]{0x64, 0x6F, 0x63, 0x50, 0x72, 0x6F, 0x70, 0x73};
- boolean flag1 = FileMagicNumber.compareBytes(bytes, bytes1, (byte) 0x1e);
- boolean flag2 = FileMagicNumber.compareBytes(bytes, bytes2, (byte) 0x1e);
- boolean flag3 = FileMagicNumber.compareBytes(bytes, bytes3, (byte) 0x1e);
+ final byte[] bytes1 = new byte[]{0x5B, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x5F, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5D, 0x2E, 0x78, 0x6D, 0x6C};
+ final byte[] bytes2 = new byte[]{0x5F, 0x72, 0x65, 0x6C, 0x73, 0x2F, 0x2E, 0x72, 0x65, 0x6C, 0x73};
+ final byte[] bytes3 = new byte[]{0x64, 0x6F, 0x63, 0x50, 0x72, 0x6F, 0x70, 0x73};
+ final boolean flag1 = FileMagicNumber.compareBytes(bytes, bytes1, (byte) 0x1e);
+ final boolean flag2 = FileMagicNumber.compareBytes(bytes, bytes2, (byte) 0x1e);
+ final boolean flag3 = FileMagicNumber.compareBytes(bytes, bytes3, (byte) 0x1e);
if (false == (flag1 || flag2 || flag3)) {
return UNKNOWN;
}
@@ -1217,7 +1507,7 @@ public enum FileMagicNumber {
if (index == -1) {
continue;
}
- FileMagicNumber fn = FileMagicNumber.matchOpenXmlMime(bytes, index + 30);
+ final FileMagicNumber fn = FileMagicNumber.matchOpenXmlMime(bytes, index + 30);
if (false == fn.equals(UNKNOWN)) {
return fn;
}
@@ -1225,19 +1515,26 @@ public enum FileMagicNumber {
return UNKNOWN;
}
- private static int searchSignature(byte[] bytes, int start, int rangeNum) {
- byte[] signature = new byte[]{0x50, 0x4B, 0x03, 0x04};
- int length = bytes.length;
+ /**
+ * 查找文档签名(文档标识)
+ *
+ * @param bytes bytes
+ * @param start 开始位置
+ * @param rangeNum 步进长度
+ * @return 签名
+ */
+ @SuppressWarnings("SameParameterValue")
+ private static int searchSignature(final byte[] bytes, final int start, final int rangeNum) {
+ final byte[] signature = new byte[]{0x50, 0x4B, 0x03, 0x04};
+ final int length = bytes.length;
int end = start + rangeNum;
if (end > length) {
end = length;
}
- int index = FileMagicNumber.indexOf(Arrays.copyOfRange(bytes, start, end), signature);
+ final int index = FileMagicNumber.indexOf(Arrays.copyOfRange(bytes, start, end), signature);
return (index == -1)
? -1
: (start + index);
}
-
- public abstract boolean match(byte[] bytes);
-
+ // endregion
}
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 5590b81f7..f82e9e260 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
@@ -1,7 +1,6 @@
package cn.hutool.core.io.file;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.func.SerConsumer;
@@ -19,7 +18,6 @@ import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import java.util.function.Function;
/**
* 文件读取器
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileTypeUtil.java
similarity index 85%
rename from hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
rename to hutool-core/src/main/java/cn/hutool/core/io/file/FileTypeUtil.java
index 1be5c63a8..04a7803ff 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileTypeUtil.java
@@ -1,7 +1,8 @@
-package cn.hutool.core.io;
+package cn.hutool.core.io.file;
import cn.hutool.core.codec.HexUtil;
-import cn.hutool.core.io.file.FileNameUtil;
+import cn.hutool.core.io.IORuntimeException;
+import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
import java.io.File;
@@ -32,7 +33,7 @@ public class FileTypeUtil {
* @param extName 文件扩展名
* @return 之前已经存在的文件扩展名
*/
- public static String putFileType(String fileStreamHexHead, String extName) {
+ public static String putFileType(final String fileStreamHexHead, final String extName) {
return FILE_TYPE_MAP.put(fileStreamHexHead, extName);
}
@@ -42,7 +43,7 @@ public class FileTypeUtil {
* @param fileStreamHexHead 文件流头部Hex信息
* @return 移除的文件扩展名
*/
- public static String removeFileType(String fileStreamHexHead) {
+ public static String removeFileType(final String fileStreamHexHead) {
return FILE_TYPE_MAP.remove(fileStreamHexHead);
}
@@ -52,13 +53,13 @@ public class FileTypeUtil {
* @param fileStreamHexHead 文件流头部16进制字符串
* @return 文件类型,未找到为{@code null}
*/
- public static String getType(String fileStreamHexHead) {
- for (Entry fileTypeEntry : FILE_TYPE_MAP.entrySet()) {
+ public static String getType(final String fileStreamHexHead) {
+ for (final Entry fileTypeEntry : FILE_TYPE_MAP.entrySet()) {
if (StrUtil.startWithIgnoreCase(fileStreamHexHead, fileTypeEntry.getKey())) {
return fileTypeEntry.getValue();
}
}
- byte[] bytes = (HexUtil.decodeHex(fileStreamHexHead));
+ final byte[] bytes = (HexUtil.decodeHex(fileStreamHexHead));
return FileMagicNumber.getMagicNumber(bytes).getExtension();
}
@@ -68,8 +69,9 @@ public class FileTypeUtil {
* @param in 文件流
* @param fileHeadSize 自定义读取文件头部的大小
* @return 文件类型,未找到为{@code null}
+ * @throws IORuntimeException IO异常
*/
- public static String getType(InputStream in,int fileHeadSize) throws IORuntimeException {
+ public static String getType(final InputStream in, final int fileHeadSize) throws IORuntimeException {
return getType((IoUtil.readHex(in, fileHeadSize,false)));
}
@@ -82,7 +84,7 @@ public class FileTypeUtil {
* @return 类型,文件的扩展名,未找到为{@code null}
* @throws IORuntimeException 读取流引起的异常
*/
- public static String getType(InputStream in,boolean isExact) throws IORuntimeException {
+ public static String getType(final InputStream in, final boolean isExact) throws IORuntimeException {
return isExact
?getType(readHex8192Upper(in))
:getType(readHex64Upper(in));
@@ -96,7 +98,7 @@ public class FileTypeUtil {
* @return 类型,文件的扩展名,未找到为{@code null}
* @throws IORuntimeException 读取流引起的异常
*/
- public static String getType(InputStream in) throws IORuntimeException {
+ public static String getType(final InputStream in) throws IORuntimeException {
return getType(in,false);
}
@@ -116,7 +118,7 @@ public class FileTypeUtil {
* @return 类型,文件的扩展名,未找到为{@code null}
* @throws IORuntimeException 读取流引起的异常
*/
- public static String getType(InputStream in, String filename) throws IORuntimeException {
+ public static String getType(final InputStream in, final String filename) throws IORuntimeException {
return getType(in,filename,false);
}
@@ -136,7 +138,7 @@ public class FileTypeUtil {
* @return 类型,文件的扩展名,未找到为{@code null}
* @throws IORuntimeException 读取流引起的异常
*/
- public static String getType(InputStream in, String filename,boolean isExact) throws IORuntimeException {
+ public static String getType(final InputStream in, final String filename, final boolean isExact) throws IORuntimeException {
String typeName = getType(in,isExact);
if (null == typeName) {
// 未成功识别类型,扩展名辅助识别
@@ -193,7 +195,7 @@ public class FileTypeUtil {
* @return 类型,文件的扩展名,未找到为{@code null}
* @throws IORuntimeException 读取文件引起的异常
*/
- public static String getType(File file,boolean isExact) throws IORuntimeException {
+ public static String getType(final File file, final boolean isExact) throws IORuntimeException {
InputStream in = null;
try {
in = IoUtil.toStream(file);
@@ -216,7 +218,7 @@ public class FileTypeUtil {
* @return 类型,文件的扩展名,未找到为{@code null}
* @throws IORuntimeException 读取文件引起的异常
*/
- public static String getType(File file) throws IORuntimeException {
+ public static String getType(final File file) throws IORuntimeException {
return getType(file,false);
}
@@ -228,7 +230,7 @@ public class FileTypeUtil {
* @return 类型
* @throws IORuntimeException 读取文件引起的异常
*/
- public static String getTypeByPath(String path,boolean isExact) throws IORuntimeException {
+ public static String getTypeByPath(final String path, final boolean isExact) throws IORuntimeException {
return getType(FileUtil.file(path),isExact);
}
@@ -239,7 +241,7 @@ public class FileTypeUtil {
* @return 类型
* @throws IORuntimeException 读取文件引起的异常
*/
- public static String getTypeByPath(String path) throws IORuntimeException {
+ public static String getTypeByPath(final String path) throws IORuntimeException {
return getTypeByPath(path,false);
}
@@ -252,7 +254,6 @@ public class FileTypeUtil {
*/
private static String readHex8192Upper(final InputStream in) throws IORuntimeException {
try {
- final int i = in.available();
return IoUtil.readHex(in, Math.min(8192, in.available()), false);
} catch (final IOException e) {
throw new RuntimeException(e);
@@ -266,7 +267,7 @@ public class FileTypeUtil {
* @return 16进制字符串
* @throws IORuntimeException IO异常
*/
- private static String readHex64Upper(InputStream in) throws IORuntimeException {
+ private static String readHex64Upper(final InputStream in) throws IORuntimeException {
return IoUtil.readHex(in, 64, false);
}
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileUtil.java
old mode 100755
new mode 100644
similarity index 99%
rename from hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
rename to hutool-core/src/main/java/cn/hutool/core/io/file/FileUtil.java
index d284e6a07..b2472a9f8
--- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileUtil.java
@@ -1,9 +1,9 @@
-package cn.hutool.core.io;
+package cn.hutool.core.io.file;
import cn.hutool.core.compress.ZipUtil;
-import cn.hutool.core.io.file.FileReader;
-import cn.hutool.core.io.file.*;
-import cn.hutool.core.io.file.FileWriter;
+import cn.hutool.core.io.BomReader;
+import cn.hutool.core.io.IORuntimeException;
+import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.io.stream.BOMInputStream;
import cn.hutool.core.io.unit.DataSizeUtil;
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 3c712c028..a7405a8b1 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
@@ -1,6 +1,5 @@
package cn.hutool.core.io.file;
-import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.func.Wrapper;
import cn.hutool.core.util.CharsetUtil;
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 2e8c704b0..cd51770c2 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
@@ -1,6 +1,5 @@
package cn.hutool.core.io.file;
-import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
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 3abbb178d..e6acd1ebb 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
@@ -1,6 +1,5 @@
package cn.hutool.core.io.file;
-import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.watch.SimpleWatcher;
import cn.hutool.core.lang.func.SerConsumer;
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java b/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java
index 4b9410388..e15c504ad 100755
--- a/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java
@@ -2,7 +2,6 @@ package cn.hutool.core.io.file;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Console;
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 d2553d510..4dfe544cd 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
@@ -1,7 +1,7 @@
package cn.hutool.core.io.resource;
import cn.hutool.core.classloader.ClassLoaderUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.url.URLUtil;
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 4f9f133fe..f35d598a5 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
@@ -1,6 +1,6 @@
package cn.hutool.core.io.resource;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.net.url.URLUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/ResourceUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/ResourceUtil.java
index 1ce456083..dc03d3266 100755
--- a/hutool-core/src/main/java/cn/hutool/core/io/resource/ResourceUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/ResourceUtil.java
@@ -2,7 +2,7 @@ package cn.hutool.core.io.resource;
import cn.hutool.core.collection.iter.EnumerationIter;
import cn.hutool.core.collection.iter.IterUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.classloader.ClassLoaderUtil;
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 c68159df7..24903cb21 100755
--- 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
@@ -1,6 +1,6 @@
package cn.hutool.core.io.resource;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.net.url.URLUtil;
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 a7b57302a..e4fbecb63 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
@@ -2,7 +2,7 @@ package cn.hutool.core.io.resource;
import java.io.File;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
/**
* Web root资源访问对象
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java
index 4d9b3e983..d0900753d 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java
@@ -1,6 +1,6 @@
package cn.hutool.core.io.watch;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.watch.watchers.WatcherChain;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java b/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java
index 30f443e80..75c5dc584 100644
--- a/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java
+++ b/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java
@@ -1,6 +1,6 @@
package cn.hutool.core.net.multipart;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFileHeader.java b/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFileHeader.java
index 88382709a..31bd3cc66 100644
--- a/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFileHeader.java
+++ b/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFileHeader.java
@@ -1,6 +1,6 @@
package cn.hutool.core.net.multipart;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.text.StrUtil;
/**
diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java
index 5c7de2ac7..e40212402 100644
--- a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java
@@ -4,7 +4,7 @@ import cn.hutool.core.bean.NullWrapperBean;
import cn.hutool.core.classloader.ClassLoaderUtil;
import cn.hutool.core.convert.BasicType;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.net.url.URLDecoder;
import cn.hutool.core.net.url.URLUtil;
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 6c572a5ee..bd8373d44 100755
--- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java
@@ -2102,4 +2102,36 @@ public class ArrayUtil extends PrimitiveArrayUtil {
final Set elementSet = SetUtil.of(Arrays.asList(array));
return elementSet.size() != array.length;
}
+
+ /**
+ * array数组是否以prefix开头,每个元素的匹配使用{@link ObjUtil#equals(Object, Object)}匹配。
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @param 数组元素类型
+ * @return 是否开头
+ */
+ public static boolean startWith(final T[] array, final T[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (ObjUtil.notEquals(array[i], prefix[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/CharsetUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/CharsetUtil.java
index 14d427164..18108aa08 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/CharsetUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/CharsetUtil.java
@@ -1,7 +1,7 @@
package cn.hutool.core.util;
import cn.hutool.core.io.CharsetDetector;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.text.StrUtil;
import java.io.File;
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 2f446e5fd..32dce00d9 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
@@ -18,8 +18,7 @@ public class PrimitiveArrayUtil {
*/
public static final int INDEX_NOT_FOUND = -1;
- // ---------------------------------------------------------------------- isEmpty
-
+ // region ----- isEmpty
/**
* 数组是否为空
*
@@ -99,8 +98,9 @@ public class PrimitiveArrayUtil {
public static boolean isEmpty(final boolean[] array) {
return array == null || array.length == 0;
}
+ // endregion
- // ---------------------------------------------------------------------- isNotEmpty
+ // region ----- isNotEmpty
/**
* 数组是否为非空
@@ -181,8 +181,9 @@ public class PrimitiveArrayUtil {
public static boolean isNotEmpty(final boolean[] array) {
return false == isEmpty(array);
}
+ // endregion
- // ---------------------------------------------------------------------- resize
+ // region ----- resize
/**
* 生成一个新的重新设置大小的数组
@@ -203,8 +204,9 @@ public class PrimitiveArrayUtil {
}
return newArray;
}
+ // endregion
- // ---------------------------------------------------------------------- addAll
+ // region ----- addAll
/**
* 将多个数组合并在一起
@@ -461,8 +463,9 @@ public class PrimitiveArrayUtil {
}
return result;
}
+ // endregion
- // ---------------------------------------------------------------------- split
+ // region ----- split
/**
* 拆分byte数组为几个等份(最后一份按照剩余长度分配空间)
@@ -472,7 +475,7 @@ public class PrimitiveArrayUtil {
* @return 拆分后的数组
*/
public static byte[][] split(final byte[] array, final int len) {
- int amount = array.length / len;
+ final int amount = array.length / len;
final int remainder = array.length % len;
// 兼容切片长度大于原数组长度的情况
final boolean hasRemainder = remainder > 0;
@@ -493,8 +496,9 @@ public class PrimitiveArrayUtil {
}
return arrays;
}
+ // endregion
- // ---------------------------------------------------------------------- indexOf、LastIndexOf、contains
+ // region ----- indexOf、LastIndexOf、contains
/**
* 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND}
@@ -895,8 +899,9 @@ public class PrimitiveArrayUtil {
public static boolean contains(final boolean[] array, final boolean value) {
return indexOf(array, value) > INDEX_NOT_FOUND;
}
+ // endregion
- // ------------------------------------------------------------------- Wrap and unwrap
+ // region ----- Wrap and unwrap
/**
* 将原始类型数组包装为包装类型
@@ -1250,8 +1255,9 @@ public class PrimitiveArrayUtil {
}
return array;
}
+ // endregion
- // ------------------------------------------------------------------- sub
+ // region ----- sub
/**
* 获取子数组
@@ -1548,8 +1554,9 @@ public class PrimitiveArrayUtil {
}
return Arrays.copyOfRange(array, start, end);
}
+ // endregion
- // ------------------------------------------------------------------- remove
+ // region ----- remove
/**
* 移除数组中对应位置的元素
@@ -1693,7 +1700,7 @@ public class PrimitiveArrayUtil {
return result;
}
- // ---------------------------------------------------------------------- removeEle
+ // region ----- removeEle
/**
* 移除数组中指定的元素
@@ -1814,8 +1821,9 @@ public class PrimitiveArrayUtil {
public static boolean[] removeEle(final boolean[] array, final boolean element) throws IllegalArgumentException {
return remove(array, indexOf(array, element));
}
+ // endregion
- // ---------------------------------------------------------------------- reverse
+ // region ----- reverse
/**
* 反转数组,会变更原数组
@@ -2088,8 +2096,9 @@ public class PrimitiveArrayUtil {
public static boolean[] reverse(final boolean[] array) {
return reverse(array, 0, array.length);
}
+ // endregion
- // ------------------------------------------------------------------------------------------------------------ min and max
+ // region ------------------------------------------- min and max
/**
* 取最小值
@@ -2370,8 +2379,9 @@ public class PrimitiveArrayUtil {
}
return max;
}
+ // endregion
- // ---------------------------------------------------------------------- shuffle
+ // region ----- shuffle
/**
* 打乱数组顺序,会变更原数组
@@ -2636,8 +2646,9 @@ public class PrimitiveArrayUtil {
return array;
}
+ // endregion
- // ---------------------------------------------------------------------- swap
+ // region ----- swap
/**
* 交换数组中两个位置的值
@@ -2791,7 +2802,7 @@ public class PrimitiveArrayUtil {
return array;
}
- // ---------------------------------------------------------------------- asc and desc
+ // region ----- asc and desc
/**
* 检查数组是否升序,即{@code array[i] <= array[i+1]}
@@ -3111,7 +3122,257 @@ public class PrimitiveArrayUtil {
return false;
}
}
-
return true;
}
+ // endregion
+
+ // region ----- startWith
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final boolean[] array, final boolean[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final byte[] array, final byte[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final char[] array, final char[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final double[] array, final double[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final float[] array, final float[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final int[] array, final int[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final long[] array, final long[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * array数组是否以prefix开头
+ *
+ * - array和prefix为同一个数组(即array == prefix),返回{@code true}
+ * - array或prefix为空数组(null或length为0的数组),返回{@code true}
+ * - prefix长度大于array,返回{@code false}
+ *
+ *
+ * @param array 数组
+ * @param prefix 前缀
+ * @return 是否开头
+ */
+ public static boolean startWith(final short[] array, final short[] prefix) {
+ if (array == prefix) {
+ return true;
+ }
+ if(isEmpty(array)){
+ return isEmpty(prefix);
+ }
+ if (prefix.length > array.length) {
+ return false;
+ }
+
+ for (int i = 0; i < prefix.length; i++) {
+ if (array[i] != prefix[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ // endregion
}
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 65d66f91a..ffab70fcf 100755
--- a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java
@@ -4,11 +4,10 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
-import cn.hutool.core.lang.Console;
import cn.hutool.core.map.BiMap;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-core/src/test/java/cn/hutool/core/compress/ZipWriterTest.java b/hutool-core/src/test/java/cn/hutool/core/compress/ZipWriterTest.java
index f575483ab..c38f5a213 100755
--- a/hutool-core/src/test/java/cn/hutool/core/compress/ZipWriterTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/compress/ZipWriterTest.java
@@ -1,6 +1,6 @@
package cn.hutool.core.compress;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.resource.FileResource;
import cn.hutool.core.util.CharsetUtil;
import org.junit.Ignore;
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 af486b7ee..bee7c8a4b 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
@@ -1,7 +1,7 @@
package cn.hutool.core.convert;
import cn.hutool.core.convert.impl.ArrayConverter;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import org.junit.Assert;
import org.junit.Ignore;
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java
index c626a4a52..e7d865f5f 100755
--- a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java
@@ -1,5 +1,7 @@
package cn.hutool.core.io;
+import cn.hutool.core.io.file.FileTypeUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.Console;
import org.junit.Assert;
@@ -85,4 +87,11 @@ public class FileTypeUtilTest {
final String type = FileTypeUtil.getType(inputStream);
Console.log(type);
}
+
+ @Test
+ public void issueI6MACITest() {
+ final File file = FileUtil.file("text.txt");
+ final String type = FileTypeUtil.getType(file);
+ Assert.assertEquals("txt", type);
+ }
}
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 0edc2f82d..b5aac3796 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
@@ -2,6 +2,7 @@ package cn.hutool.core.io;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.file.FileNameUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.file.LineSeparator;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/NioUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/NioUtilTest.java
index 334d76212..cacfbfafe 100755
--- a/hutool-core/src/test/java/cn/hutool/core/io/NioUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/NioUtilTest.java
@@ -1,5 +1,6 @@
package cn.hutool.core.io;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.io.stream.EmptyOutputStream;
import cn.hutool.core.lang.Console;
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/file/IssueI666HBTest.java b/hutool-core/src/test/java/cn/hutool/core/io/file/IssueI666HBTest.java
index 6e16ca2f9..934daef76 100755
--- a/hutool-core/src/test/java/cn/hutool/core/io/file/IssueI666HBTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/file/IssueI666HBTest.java
@@ -1,6 +1,5 @@
package cn.hutool.core.io.file;
-import cn.hutool.core.io.FileUtil;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/file/PathDeleterTest.java b/hutool-core/src/test/java/cn/hutool/core/io/file/PathDeleterTest.java
index 98eba2832..32e9a7f1e 100755
--- a/hutool-core/src/test/java/cn/hutool/core/io/file/PathDeleterTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/file/PathDeleterTest.java
@@ -1,6 +1,5 @@
package cn.hutool.core.io.file;
-import cn.hutool.core.io.FileUtil;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/file/PathUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/file/PathUtilTest.java
index 364d70051..62fb093d2 100644
--- a/hutool-core/src/test/java/cn/hutool/core/io/file/PathUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/file/PathUtilTest.java
@@ -1,6 +1,5 @@
package cn.hutool.core.io.file;
-import cn.hutool.core.io.FileUtil;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/file/TailerTest.java b/hutool-core/src/test/java/cn/hutool/core/io/file/TailerTest.java
index 027abb049..7a365555d 100644
--- a/hutool-core/src/test/java/cn/hutool/core/io/file/TailerTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/file/TailerTest.java
@@ -3,7 +3,6 @@ package cn.hutool.core.io.file;
import org.junit.Ignore;
import org.junit.Test;
-import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
public class TailerTest {
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/resource/ResourceUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/resource/ResourceUtilTest.java
index 437af0cf1..45981ce6e 100644
--- a/hutool-core/src/test/java/cn/hutool/core/io/resource/ResourceUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/resource/ResourceUtilTest.java
@@ -1,6 +1,6 @@
package cn.hutool.core.io.resource;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
import org.junit.Assert;
diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/SimpleSchedulerTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/SimpleSchedulerTest.java
index 76ff6b082..a382c5e9d 100644
--- a/hutool-core/src/test/java/cn/hutool/core/thread/SimpleSchedulerTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/thread/SimpleSchedulerTest.java
@@ -1,6 +1,6 @@
package cn.hutool.core.thread;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.RuntimeUtil;
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java
index 5bad7fd2b..3c009e5c3 100755
--- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java
@@ -617,7 +617,7 @@ public class ArrayUtilTest {
@Test
public void subTest() {
final int[] arr = {1, 2, 3, 4, 5};
- int[] empty = new int[0];
+ final int[] empty = new int[0];
Assert.assertArrayEquals(empty, ArrayUtil.sub(arr, 2, 2));
Assert.assertArrayEquals(empty, ArrayUtil.sub(arr, 5, 5));
Assert.assertArrayEquals(empty, ArrayUtil.sub(arr, 5, 7));
@@ -689,4 +689,34 @@ public class ArrayUtilTest {
Assert.assertTrue(ArrayUtil.hasSameElement(e));
}
+
+ @Test
+ public void startWithTest() {
+ boolean b = ArrayUtil.startWith(new String[]{}, new String[]{});
+ Assert.assertTrue(b);
+
+ b = ArrayUtil.startWith(new String[]{"1", "2", "3"}, new String[]{"1"});
+ Assert.assertTrue(b);
+
+ b = ArrayUtil.startWith(new String[]{"1"}, new String[]{"1"});
+ Assert.assertTrue(b);
+
+ b = ArrayUtil.startWith((String[])null, null);
+ Assert.assertTrue(b);
+ }
+
+ @Test
+ public void startWithTest2() {
+ boolean b = ArrayUtil.startWith(new int[]{}, new int[]{});
+ Assert.assertTrue(b);
+
+ b = ArrayUtil.startWith(new int[]{1,2,3}, new int[]{1});
+ Assert.assertTrue(b);
+
+ b = ArrayUtil.startWith(new int[]{1}, new int[]{1});
+ Assert.assertTrue(b);
+
+ b = ArrayUtil.startWith((int[])null, null);
+ Assert.assertTrue(b);
+ }
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java
index aac0e1b76..f6011e994 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java
@@ -2,7 +2,7 @@ package cn.hutool.core.util;
import cn.hutool.core.compress.ZipReader;
import cn.hutool.core.compress.ZipUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.lang.Console;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/KeyUtil.java b/hutool-crypto/src/main/java/cn/hutool/crypto/KeyUtil.java
index 5f028e992..7d2e87923 100644
--- a/hutool-crypto/src/main/java/cn/hutool/crypto/KeyUtil.java
+++ b/hutool-crypto/src/main/java/cn/hutool/crypto/KeyUtil.java
@@ -1,7 +1,7 @@
package cn.hutool.crypto;
import cn.hutool.core.codec.BaseN.Base64;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/Digester.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/Digester.java
index 7259d347e..046087077 100755
--- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/Digester.java
+++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/Digester.java
@@ -1,6 +1,6 @@
package cn.hutool.crypto.digest;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ArrayUtil;
diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/mac/Mac.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/mac/Mac.java
index a30d9f133..8b5c4e7cb 100755
--- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/mac/Mac.java
+++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/mac/Mac.java
@@ -1,7 +1,7 @@
package cn.hutool.crypto.digest.mac;
import cn.hutool.core.codec.BaseN.Base64;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.codec.HexUtil;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/PemUtilTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/PemUtilTest.java
index 86173e5d4..e1e642300 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/PemUtilTest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/PemUtilTest.java
@@ -1,6 +1,6 @@
package cn.hutool.crypto;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
diff --git a/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java b/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java
index 9d1e70dc3..71f85f6d7 100644
--- a/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java
+++ b/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java
@@ -1,7 +1,7 @@
package cn.hutool.db;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.text.StrUtil;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/SevenZArchiver.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/SevenZArchiver.java
index 2762a5233..31650006f 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/SevenZArchiver.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/SevenZArchiver.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.compress.archiver;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/StreamArchiver.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/StreamArchiver.java
index 052c4657a..66ce4bbb3 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/StreamArchiver.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/StreamArchiver.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.compress.archiver;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/SevenZExtractor.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/SevenZExtractor.java
index 637f326b2..f452e5523 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/SevenZExtractor.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/SevenZExtractor.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.compress.extractor;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java
index 5c907dc72..75172b6d4 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.compress.extractor;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java
index 8de423650..1af69d6a3 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java
@@ -1,7 +1,7 @@
package cn.hutool.extra.ftp;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.CharUtil;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java
index 6092b475d..6b251c1a6 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java
@@ -1,7 +1,7 @@
package cn.hutool.extra.ftp;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Assert;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java
index 6c0650676..24b8d52a9 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java
@@ -1,7 +1,7 @@
package cn.hutool.extra.mail;
import cn.hutool.core.lang.builder.Builder;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/management/RuntimeInfo.java b/hutool-extra/src/main/java/cn/hutool/extra/management/RuntimeInfo.java
index e6cf3eca6..ae6b35e0c 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/management/RuntimeInfo.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/management/RuntimeInfo.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.management;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import java.io.Serializable;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java
index 1dec0bcc0..f9dda33d6 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.qrcode;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.swing.img.ImgUtil;
import com.google.zxing.BarcodeFormat;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/servlet/JakartaServletUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/servlet/JakartaServletUtil.java
index 6d80f8a84..b036c7326 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/servlet/JakartaServletUtil.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/servlet/JakartaServletUtil.java
@@ -6,7 +6,7 @@ import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.collection.iter.ArrayIter;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.CaseInsensitiveMap;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/servlet/ServletUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/servlet/ServletUtil.java
index c58da909f..a6d6325b0 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/servlet/ServletUtil.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/servlet/ServletUtil.java
@@ -6,7 +6,7 @@ import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.collection.iter.ArrayIter;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.CaseInsensitiveMap;
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 675b55c2d..bd01b8da7 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java
@@ -2,7 +2,7 @@ package cn.hutool.extra.ssh;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.extra.ftp.AbstractFtp;
import cn.hutool.extra.ftp.FtpConfig;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/Template.java b/hutool-extra/src/main/java/cn/hutool/extra/template/Template.java
index feb6dca32..be7f4d4f7 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/Template.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/Template.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.template;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import java.io.BufferedOutputStream;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
index b7dce0f16..e03a5457b 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.template.engine.enjoy;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.id.IdUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.template.Template;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
index 876638de0..69cf65b83 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
@@ -1,7 +1,7 @@
package cn.hutool.extra.template.engine.freemarker;
import cn.hutool.core.classloader.ClassLoaderUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
index dbd57ea3f..a527113cd 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
@@ -7,7 +7,7 @@ import org.thymeleaf.templateresolver.FileTemplateResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
import org.thymeleaf.templateresolver.StringTemplateResolver;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
index 30a796d7f..e7c813703 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.template.engine.wit;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.map.Dict;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/xml/JAXBUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/xml/JAXBUtil.java
index ec13c635c..9a1cf4b30 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/xml/JAXBUtil.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/xml/JAXBUtil.java
@@ -1,7 +1,7 @@
package cn.hutool.extra.xml;
import cn.hutool.core.exceptions.UtilException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.CharsetUtil;
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/compress/ArchiverTest.java b/hutool-extra/src/test/java/cn/hutool/extra/compress/ArchiverTest.java
index 9fe4bf34a..a180f4a7f 100644
--- a/hutool-extra/src/test/java/cn/hutool/extra/compress/ArchiverTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/compress/ArchiverTest.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.compress;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.extra.compress.archiver.StreamArchiver;
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/compress/ExtractorTest.java b/hutool-extra/src/test/java/cn/hutool/extra/compress/ExtractorTest.java
index c7aba91ac..bf2407e5f 100644
--- a/hutool-extra/src/test/java/cn/hutool/extra/compress/ExtractorTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/compress/ExtractorTest.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.compress;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.extra.compress.extractor.Extractor;
import org.junit.Ignore;
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java b/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java
index 84b78366e..fb18662ef 100644
--- a/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.ftp;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.extra.ssh.Sftp;
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java b/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java
index caf30961b..bf84e765d 100644
--- a/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java
@@ -1,6 +1,6 @@
package cn.hutool.extra.mail;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java
index cacda174b..807405e88 100755
--- a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java
@@ -1,7 +1,7 @@
package cn.hutool.extra.qrcode;
import cn.hutool.core.codec.BaseN.Base64;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-http/src/main/java/cn/hutool/http/client/body/MultipartOutputStream.java b/hutool-http/src/main/java/cn/hutool/http/client/body/MultipartOutputStream.java
index ceb99425f..24627c79e 100644
--- a/hutool-http/src/main/java/cn/hutool/http/client/body/MultipartOutputStream.java
+++ b/hutool-http/src/main/java/cn/hutool/http/client/body/MultipartOutputStream.java
@@ -1,7 +1,7 @@
package cn.hutool.http.client.body;
import cn.hutool.core.convert.Convert;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.HttpResource;
diff --git a/hutool-http/src/main/java/cn/hutool/http/client/body/ResponseBody.java b/hutool-http/src/main/java/cn/hutool/http/client/body/ResponseBody.java
index ae5d3f3a8..c1019d73c 100755
--- a/hutool-http/src/main/java/cn/hutool/http/client/body/ResponseBody.java
+++ b/hutool-http/src/main/java/cn/hutool/http/client/body/ResponseBody.java
@@ -1,6 +1,6 @@
package cn.hutool.http.client.body;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.StreamProgress;
import cn.hutool.core.io.file.FileNameUtil;
diff --git a/hutool-http/src/main/java/cn/hutool/http/server/HttpServerResponse.java b/hutool-http/src/main/java/cn/hutool/http/server/HttpServerResponse.java
index ff04da7ac..aad4635d9 100644
--- a/hutool-http/src/main/java/cn/hutool/http/server/HttpServerResponse.java
+++ b/hutool-http/src/main/java/cn/hutool/http/server/HttpServerResponse.java
@@ -1,6 +1,6 @@
package cn.hutool.http.server;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.net.url.URLEncoder;
diff --git a/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java b/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java
index ce1b31c9a..e8cf6149e 100644
--- a/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java
+++ b/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java
@@ -1,7 +1,7 @@
package cn.hutool.http.server.action;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.http.server.HttpServerRequest;
import cn.hutool.http.server.HttpServerResponse;
diff --git a/hutool-http/src/test/java/cn/hutool/http/DownloadTest.java b/hutool-http/src/test/java/cn/hutool/http/DownloadTest.java
index 15e73e42d..ec5e36eb7 100644
--- a/hutool-http/src/test/java/cn/hutool/http/DownloadTest.java
+++ b/hutool-http/src/test/java/cn/hutool/http/DownloadTest.java
@@ -1,7 +1,7 @@
package cn.hutool.http;
import cn.hutool.core.codec.BaseN.Base64;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.StreamProgress;
import cn.hutool.core.lang.Console;
diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java
index 4d67192e7..46205f016 100755
--- a/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java
+++ b/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java
@@ -1,6 +1,6 @@
package cn.hutool.http;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.regex.ReUtil;
import cn.hutool.core.util.CharsetUtil;
diff --git a/hutool-http/src/test/java/cn/hutool/http/UploadTest.java b/hutool-http/src/test/java/cn/hutool/http/UploadTest.java
index b6095fadf..2117b9be7 100644
--- a/hutool-http/src/test/java/cn/hutool/http/UploadTest.java
+++ b/hutool-http/src/test/java/cn/hutool/http/UploadTest.java
@@ -1,6 +1,6 @@
package cn.hutool.http;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.resource.MultiFileResource;
import cn.hutool.core.lang.Console;
import cn.hutool.core.map.MapUtil;
diff --git a/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java b/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java
index 8b7a8be18..dffe0e455 100644
--- a/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java
+++ b/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java
@@ -1,7 +1,7 @@
package cn.hutool.http.server;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.net.multipart.UploadFile;
import cn.hutool.http.meta.ContentType;
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 7863af839..df799b09b 100755
--- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java
+++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java
@@ -1,8 +1,7 @@
package cn.hutool.json;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
-import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.reflect.TypeReference;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil;
diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java
index 97a3ca581..a47014556 100755
--- a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java
+++ b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java
@@ -2,7 +2,7 @@ package cn.hutool.json;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.ConvertException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.map.Dict;
import cn.hutool.core.reflect.TypeReference;
import cn.hutool.core.util.CharsetUtil;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvBaseReader.java b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvBaseReader.java
index 475d08d5f..609167f7f 100755
--- a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvBaseReader.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvBaseReader.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.csv;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvReader.java b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvReader.java
index d80eabc81..86f98424e 100755
--- a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvReader.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvReader.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.csv;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.func.SerConsumer;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvWriter.java
index 30ec937d4..edab978bb 100755
--- a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvWriter.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvWriter.java
@@ -4,7 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.iter.ArrayIter;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java
index d8f619d85..cfeb73430 100644
--- a/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.excel;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFSheet;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java
index 8dc63595a..a953aba71 100644
--- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.excel;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.func.SerBiConsumer;
import cn.hutool.poi.excel.cell.CellEditor;
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 85c9b7034..22a59c968 100755
--- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java
@@ -1,7 +1,7 @@
package cn.hutool.poi.excel;
import cn.hutool.core.exceptions.DependencyException;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.regex.ReUtil;
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 b14a814e6..daf67cab2 100755
--- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java
@@ -3,7 +3,7 @@ package cn.hutool.poi.excel;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.comparator.IndexedComparator;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java
index ec41107ec..093b3bb26 100644
--- a/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java
@@ -1,7 +1,7 @@
package cn.hutool.poi.excel;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java
index 267c83adf..ebea0cd08 100644
--- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.excel.sax;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.poi.exceptions.POIException;
import java.io.File;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/word/DocUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/word/DocUtil.java
index 3d713eb6d..d949e20a5 100644
--- a/hutool-poi/src/main/java/cn/hutool/poi/word/DocUtil.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/word/DocUtil.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.word;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.poi.exceptions.POIException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
diff --git a/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java b/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java
index 473067d8a..5e390ea64 100644
--- a/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java
+++ b/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.word;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java
index 4e9c19931..9e1dd52ca 100755
--- a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java
@@ -2,7 +2,7 @@ package cn.hutool.poi.csv;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java
index cd929bb8e..689065c1f 100755
--- a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java
@@ -2,7 +2,7 @@ package cn.hutool.poi.csv;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
import lombok.AllArgsConstructor;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvWriterTest.java b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvWriterTest.java
index 3321137a9..791d844f4 100755
--- a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvWriterTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvWriterTest.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.csv;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
import org.junit.Ignore;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/csv/Issue2783Test.java b/hutool-poi/src/test/java/cn/hutool/poi/csv/Issue2783Test.java
index c0c43a705..101dd6937 100755
--- a/hutool-poi/src/test/java/cn/hutool/poi/csv/Issue2783Test.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/csv/Issue2783Test.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.csv;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.func.SerConsumer;
import cn.hutool.core.util.CharsetUtil;
import org.junit.Ignore;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java
index 0c8aa0700..4c2c5e461 100644
--- a/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java
@@ -2,7 +2,7 @@ package cn.hutool.poi.excel;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.poi.excel.style.StyleUtil;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelFileUtilTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelFileUtilTest.java
index df0a1853a..4b9a9f07c 100755
--- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelFileUtilTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelFileUtilTest.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.excel;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import org.junit.Assert;
import org.junit.Test;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java
index cd0cb8f95..bafdfa8b3 100644
--- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java
@@ -2,7 +2,7 @@ package cn.hutool.poi.excel;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.text.StrUtil;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java
index 930747589..cc9a69430 100755
--- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java
@@ -2,7 +2,7 @@ package cn.hutool.poi.excel;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.lang.id.IdUtil;
import cn.hutool.core.map.MapUtil;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2307Test.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2307Test.java
index 35c30d41e..58312bde4 100644
--- a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2307Test.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2307Test.java
@@ -1,7 +1,7 @@
package cn.hutool.poi.excel;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.xssf.usermodel.XSSFSheet;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueI66Z6BTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueI66Z6BTest.java
index b2c08c300..e160fed80 100755
--- a/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueI66Z6BTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueI66Z6BTest.java
@@ -1,7 +1,7 @@
package cn.hutool.poi.excel;
import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/ofd/OfdWriterTest.java b/hutool-poi/src/test/java/cn/hutool/poi/ofd/OfdWriterTest.java
index 9600ab3ce..292db1ef9 100644
--- a/hutool-poi/src/test/java/cn/hutool/poi/ofd/OfdWriterTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/ofd/OfdWriterTest.java
@@ -1,6 +1,6 @@
package cn.hutool.poi.ofd;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java b/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java
index 8b54e0996..510eaf870 100644
--- a/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java
@@ -2,7 +2,7 @@ package cn.hutool.poi.word;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console;
import lombok.AllArgsConstructor;
import lombok.Data;
diff --git a/hutool-setting/src/main/java/cn/hutool/setting/Setting.java b/hutool-setting/src/main/java/cn/hutool/setting/Setting.java
index 3aad945c7..705f9079d 100644
--- a/hutool-setting/src/main/java/cn/hutool/setting/Setting.java
+++ b/hutool-setting/src/main/java/cn/hutool/setting/Setting.java
@@ -2,7 +2,7 @@ package cn.hutool.setting;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.Resource;
import cn.hutool.core.io.resource.ResourceUtil;
diff --git a/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java b/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java
index 516284d49..7715aeb86 100755
--- a/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java
+++ b/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java
@@ -1,6 +1,6 @@
package cn.hutool.setting;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.LineReader;
import cn.hutool.core.io.resource.Resource;
diff --git a/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java b/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java
index c7bfac22d..f251cdc09 100644
--- a/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java
+++ b/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java
@@ -1,7 +1,7 @@
package cn.hutool.setting.dialect;
import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.Resource;
diff --git a/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java
index 0c1c2f80d..a5c77b2ea 100644
--- a/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java
+++ b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java
@@ -1,6 +1,5 @@
package cn.hutool.setting.dialect;
-import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.io.resource.NoResourceException;
import cn.hutool.core.map.SafeConcurrentHashMap;
diff --git a/hutool-setting/src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java b/hutool-setting/src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java
index c27825e39..ed409e3a2 100755
--- a/hutool-setting/src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java
+++ b/hutool-setting/src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java
@@ -1,6 +1,6 @@
package cn.hutool.setting.yaml;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.map.Dict;
import cn.hutool.core.util.CharsetUtil;
import org.junit.Assert;
diff --git a/hutool-swing/src/main/java/cn/hutool/swing/captcha/AbstractCaptcha.java b/hutool-swing/src/main/java/cn/hutool/swing/captcha/AbstractCaptcha.java
index ad031b020..e3202d6c7 100755
--- a/hutool-swing/src/main/java/cn/hutool/swing/captcha/AbstractCaptcha.java
+++ b/hutool-swing/src/main/java/cn/hutool/swing/captcha/AbstractCaptcha.java
@@ -1,7 +1,7 @@
package cn.hutool.swing.captcha;
import cn.hutool.core.codec.BaseN.Base64;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.net.url.URLUtil;
diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/BackgroundRemoval.java b/hutool-swing/src/main/java/cn/hutool/swing/img/BackgroundRemoval.java
index 571e9ce59..21af9782b 100755
--- a/hutool-swing/src/main/java/cn/hutool/swing/img/BackgroundRemoval.java
+++ b/hutool-swing/src/main/java/cn/hutool/swing/img/BackgroundRemoval.java
@@ -1,6 +1,6 @@
package cn.hutool.swing.img;
-import cn.hutool.core.io.FileTypeUtil;
+import cn.hutool.core.io.file.FileTypeUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.swing.img.color.ColorUtil;
diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java
index b16760b21..f4c81603c 100755
--- a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java
+++ b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java
@@ -1,7 +1,7 @@
package cn.hutool.swing.img;
import cn.hutool.core.codec.BaseN.Base64;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil;
diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgWriter.java b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgWriter.java
index 0f07d572d..506fc39c2 100644
--- a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgWriter.java
+++ b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgWriter.java
@@ -1,6 +1,6 @@
package cn.hutool.swing.img;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
diff --git a/hutool-swing/src/test/java/cn/hutool/swing/RobotUtilTest.java b/hutool-swing/src/test/java/cn/hutool/swing/RobotUtilTest.java
index 00c32e48c..17862906d 100755
--- a/hutool-swing/src/test/java/cn/hutool/swing/RobotUtilTest.java
+++ b/hutool-swing/src/test/java/cn/hutool/swing/RobotUtilTest.java
@@ -1,6 +1,6 @@
package cn.hutool.swing;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-swing/src/test/java/cn/hutool/swing/img/ImgTest.java b/hutool-swing/src/test/java/cn/hutool/swing/img/ImgTest.java
index 4973c1823..16ebc058b 100755
--- a/hutool-swing/src/test/java/cn/hutool/swing/img/ImgTest.java
+++ b/hutool-swing/src/test/java/cn/hutool/swing/img/ImgTest.java
@@ -1,7 +1,7 @@
package cn.hutool.swing.img;
-import cn.hutool.core.io.FileTypeUtil;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileTypeUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.net.url.URLUtil;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/hutool-swing/src/test/java/cn/hutool/swing/img/ImgUtilTest.java b/hutool-swing/src/test/java/cn/hutool/swing/img/ImgUtilTest.java
index 47dcd5fdd..521f0b118 100755
--- a/hutool-swing/src/test/java/cn/hutool/swing/img/ImgUtilTest.java
+++ b/hutool-swing/src/test/java/cn/hutool/swing/img/ImgUtilTest.java
@@ -1,6 +1,6 @@
package cn.hutool.swing.img;
-import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.lang.Console;
import cn.hutool.swing.img.color.ColorUtil;