diff --git a/CHANGELOG.md b/CHANGELOG.md
index fbeadc8ae..e43c33b3c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,9 @@
* 【core 】 CaseInsensitiveMap/CamelCaseMap增加toString(issue#636@Github)
* 【core 】 XmlUtil多节点改进(issue#I15I0R@Gitee)
* 【core 】 Thread.excAsync修正为execAsync(issue#642@Github)
+* 【core 】 FileUtil.getAbsolutePath修正正则(issue#648@Github)
+* 【core 】 NetUtil增加getNetworkInterface方法(issue#I15WEL@Gitee)
+* 【core 】 增加ReflectUtil.getFieldMap方法(issue#I15WJ7@Gitee)
### Bug修复
* 【extra】 修复SFTP.upload上传失败的问题(issue#I15O40@Gitee)
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
index d12af648e..8889d8bee 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
@@ -1,23 +1,65 @@
package cn.hutool.core.io;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.file.FileCopier;
+import cn.hutool.core.io.file.FileMode;
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.file.FileReader.ReaderHandler;
+import cn.hutool.core.io.file.FileWriter;
+import cn.hutool.core.io.file.LineSeparator;
+import cn.hutool.core.io.file.Tailer;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.*;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.CharUtil;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.ClassUtil;
+import cn.hutool.core.util.ReUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.URLUtil;
+import cn.hutool.core.util.ZipUtil;
-import java.io.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.RandomAccessFile;
+import java.io.Reader;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
-import java.nio.file.*;
+import java.nio.file.CopyOption;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileVisitOption;
+import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitor;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.text.DecimalFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
import java.util.jar.JarFile;
import java.util.regex.Pattern;
import java.util.zip.CRC32;
@@ -562,8 +604,8 @@ public class FileUtil {
if (ArrayUtil.isEmpty(subFiles)) {
return 0L;// empty directory
}
- for (int i = 0; i < subFiles.length; i++) {
- size += size(subFiles[i]);
+ for (File subFile : subFiles) {
+ size += size(subFile);
}
return size;
} else {
@@ -629,6 +671,7 @@ public class FileUtil {
if (false == file.exists()) {
mkParentDirs(file);
try {
+ //noinspection ResultOfMethodCallIgnored
file.createNewFile();
} catch (Exception e) {
throw new IORuntimeException(e);
@@ -672,6 +715,7 @@ public class FileUtil {
public static File mkParentDirs(File file) {
final File parentFile = file.getParentFile();
if (null != parentFile && false == parentFile.exists()) {
+ //noinspection ResultOfMethodCallIgnored
parentFile.mkdirs();
}
return parentFile;
@@ -835,6 +879,7 @@ public class FileUtil {
final File[] files = directory.listFiles();
if (ArrayUtil.isEmpty(files)) {
// 空文件夹则删除之
+ //noinspection ResultOfMethodCallIgnored
directory.delete();
} else {
for (File childFile : files) {
@@ -871,6 +916,7 @@ public class FileUtil {
return null;
}
if (false == dir.exists()) {
+ //noinspection ResultOfMethodCallIgnored
dir.mkdirs();
}
return dir;
@@ -918,7 +964,9 @@ public class FileUtil {
try {
File file = File.createTempFile(prefix, suffix, dir).getCanonicalFile();
if (isReCreat) {
+ //noinspection ResultOfMethodCallIgnored
file.delete();
+ //noinspection ResultOfMethodCallIgnored
file.createNewFile();
}
return file;
@@ -1083,6 +1131,7 @@ public class FileUtil {
}
if (isOverride && dest.isFile()) {// 只有目标为文件的情况下覆盖之
+ //noinspection ResultOfMethodCallIgnored
dest.delete();
}
@@ -1238,7 +1287,7 @@ public class FileUtil {
}
// 给定的路径已经是绝对路径了
- return StrUtil.C_SLASH == path.charAt(0) || path.matches("^[a-zA-Z]:[/\\\\].*");
+ return StrUtil.C_SLASH == path.charAt(0) || path.matches("^[a-zA-Z]:([/\\\\].*)?");
}
/**
diff --git a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java
index 2aea06c61..1d4eb771e 100644
--- a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java
@@ -298,6 +298,32 @@ public class NetUtil {
}
}
+ /**
+ * 获取指定名称的网卡信息
+ *
+ * @param name 网络接口名,例如Linux下默认是eth0
+ * @return 网卡,未找到返回null
+ * @since 5.0.7
+ */
+ public static NetworkInterface getNetworkInterface(String name) {
+ Enumeration networkInterfaces;
+ try {
+ networkInterfaces = NetworkInterface.getNetworkInterfaces();
+ } catch (SocketException e) {
+ return null;
+ }
+
+ NetworkInterface netInterface;
+ while(networkInterfaces.hasMoreElements()){
+ netInterface = networkInterfaces.nextElement();
+ if(null != netInterface && name.equals(netInterface.getName())){
+ return netInterface;
+ }
+ }
+
+ return null;
+ }
+
/**
* 获取本机所有网卡
*
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java
index a18a0cc2c..75c09d418 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java
@@ -6,14 +6,17 @@ import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Filter;
import cn.hutool.core.lang.SimpleCache;
+import cn.hutool.core.map.MapUtil;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -133,6 +136,22 @@ public class ReflectUtil {
return null;
}
+ /**
+ * 获取指定类中字段名和字段对应的Map,包括其父类中的字段
+ *
+ * @param beanClass 类
+ * @return 字段名和字段对应的Map
+ * @since 5.0.7
+ */
+ public static Map getFieldMap(Class> beanClass){
+ final Field[] fields = getFields(beanClass);
+ final HashMap map = MapUtil.newHashMap(fields.length);
+ for (Field field : fields) {
+ map.put(field.getName(), field);
+ }
+ return map;
+ }
+
/**
* 获得一个类中所有字段列表,包括其父类中的字段
*
@@ -350,12 +369,7 @@ public class ReflectUtil {
*/
public static List getPublicMethods(Class> clazz, Method... excludeMethods) {
final HashSet excludeMethodSet = CollectionUtil.newHashSet(excludeMethods);
- return getPublicMethods(clazz, new Filter() {
- @Override
- public boolean accept(Method method) {
- return false == excludeMethodSet.contains(method);
- }
- });
+ return getPublicMethods(clazz, method -> false == excludeMethodSet.contains(method));
}
/**
@@ -367,12 +381,7 @@ public class ReflectUtil {
*/
public static List getPublicMethods(Class> clazz, String... excludeMethodNames) {
final HashSet excludeMethodNameSet = CollectionUtil.newHashSet(excludeMethodNames);
- return getPublicMethods(clazz, new Filter() {
- @Override
- public boolean accept(Method method) {
- return false == excludeMethodNameSet.contains(method.getName());
- }
- });
+ return getPublicMethods(clazz, method -> false == excludeMethodNameSet.contains(method.getName()));
}
/**
@@ -770,7 +779,7 @@ public class ReflectUtil {
*/
public static T invokeWithCheck(Object obj, Method method, Object... args) throws UtilException {
final Class>[] types = method.getParameterTypes();
- if (null != types && null != args) {
+ if (null != args) {
Assert.isTrue(args.length == types.length, "Params length [{}] is not fit for param length [{}] of method !", args.length, types.length);
Class> type;
for (int i = 0; i < args.length; i++) {
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java
index 1dde71736..5b41e0a0c 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java
@@ -2401,7 +2401,7 @@ public class StrUtil {
Byte dataByte;
for (int i = 0; i < data.length; i++) {
dataByte = data[i];
- bytes[i] = (null == dataByte) ? -1 : dataByte.byteValue();
+ bytes[i] = (null == dataByte) ? -1 : dataByte;
}
return str(bytes, charset);
@@ -4018,8 +4018,8 @@ public class StrUtil {
*/
public static int totalLength(CharSequence... strs) {
int totalLength = 0;
- for (int i = 0; i < strs.length; i++) {
- totalLength += (null == strs[i] ? 0 : strs[i].length());
+ for (CharSequence str : strs) {
+ totalLength += (null == str ? 0 : str.length());
}
return totalLength;
}
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 77ee214a7..561e64927 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
@@ -38,12 +38,12 @@ public class FileUtilTest {
String absolutePath2 = FileUtil.getAbsolutePath(absolutePath);
Assert.assertNotNull(absolutePath2);
Assert.assertEquals(absolutePath, absolutePath2);
- }
- @Test
- public void getAbsolutePathTest2() {
String path = FileUtil.getAbsolutePath("中文.xml");
Assert.assertTrue(path.contains("中文.xml"));
+
+ path = FileUtil.getAbsolutePath("d:");
+ Assert.assertEquals("d:", path);
}
@Test
@@ -134,6 +134,7 @@ public class FileUtilTest {
Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\..\\bar"));
Assert.assertEquals("bar", FileUtil.normalize("../../bar"));
Assert.assertEquals("C:/bar", FileUtil.normalize("/C:/bar"));
+ Assert.assertEquals("C:", FileUtil.normalize("C:"));
Assert.assertEquals("\\/192.168.1.1/Share/", FileUtil.normalize("\\\\192.168.1.1\\Share\\"));
}