() {
@Override
- public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
+ public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) {
final File file = path.toFile();
if (null == fileFilter || fileFilter.accept(file)) {
fileList.add(file);
@@ -257,12 +261,12 @@ public class FileUtil {
/**
* 遍历指定path下的文件并做处理
- *
- * @param start 起始路径,必须为目录
+ *
+ * @param start 起始路径,必须为目录
* @param maxDepth 最大遍历深度,-1表示不限制深度
- * @param visitor {@link FileVisitor} 接口,用于自定义在访问文件时,访问目录前后等节点做的操作
- * @since 4.6.3
+ * @param visitor {@link FileVisitor} 接口,用于自定义在访问文件时,访问目录前后等节点做的操作
* @see Files#walkFileTree(Path, Set, int, FileVisitor)
+ * @since 4.6.3
*/
public static void walkFiles(Path start, int maxDepth, FileVisitor super Path> visitor) {
if (maxDepth < 0) {
@@ -279,7 +283,7 @@ public class FileUtil {
/**
* 递归遍历目录以及子目录中的所有文件
- *
+ *
* @param path 当前遍历文件或目录的路径
* @return 文件列表
* @since 3.2.0
@@ -290,7 +294,7 @@ public class FileUtil {
/**
* 递归遍历目录以及子目录中的所有文件
- *
+ *
* @param file 当前遍历文件
* @return 文件列表
*/
@@ -301,7 +305,7 @@ public class FileUtil {
/**
* 获得指定目录下所有文件
* 不会扫描子目录
- *
+ *
* @param path 相对ClassPath的目录或者绝对路径目录
* @return 文件路径列表(如果是jar中的文件,则给定类似.jar!/xxx/xxx的路径)
* @throws IORuntimeException IO异常
@@ -340,7 +344,7 @@ public class FileUtil {
/**
* 创建File对象,相当于调用new File(),不做任何处理
- *
+ *
* @param path 文件路径
* @return File
* @since 4.1.4
@@ -351,7 +355,7 @@ public class FileUtil {
/**
* 创建File对象,自动识别相对或绝对路径,相对路径将自动从ClassPath下寻找
- *
+ *
* @param path 文件路径
* @return File
*/
@@ -365,9 +369,9 @@ public class FileUtil {
/**
* 创建File对象
* 此方法会检查slip漏洞,漏洞说明见http://blog.nsfocus.net/zip-slip-2/
- *
+ *
* @param parent 父目录
- * @param path 文件路径
+ * @param path 文件路径
* @return File
*/
public static File file(String parent, String path) {
@@ -377,9 +381,9 @@ public class FileUtil {
/**
* 创建File对象
* 此方法会检查slip漏洞,漏洞说明见http://blog.nsfocus.net/zip-slip-2/
- *
+ *
* @param parent 父文件对象
- * @param path 文件路径
+ * @param path 文件路径
* @return File
*/
public static File file(File parent, String path) {
@@ -392,9 +396,9 @@ public class FileUtil {
/**
* 通过多层目录参数创建文件
* 此方法会检查slip漏洞,漏洞说明见http://blog.nsfocus.net/zip-slip-2/
- *
+ *
* @param directory 父目录
- * @param names 元素名(多层目录名)
+ * @param names 元素名(多层目录名)
* @return the file 文件
* @since 4.0.6
*/
@@ -415,9 +419,9 @@ public class FileUtil {
/**
* 通过多层目录创建文件
- *
+ *
* 元素名(多层目录名)
- *
+ *
* @return the file 文件
* @since 4.0.6
*/
@@ -439,7 +443,7 @@ public class FileUtil {
/**
* 创建File对象
- *
+ *
* @param uri 文件URI
* @return File
*/
@@ -452,7 +456,7 @@ public class FileUtil {
/**
* 创建File对象
- *
+ *
* @param url 文件URL
* @return File
*/
@@ -462,7 +466,7 @@ public class FileUtil {
/**
* 获取临时文件路径(绝对路径)
- *
+ *
* @return 临时文件路径
* @since 4.0.6
*/
@@ -472,7 +476,7 @@ public class FileUtil {
/**
* 获取临时文件目录
- *
+ *
* @return 临时文件目录
* @since 4.0.6
*/
@@ -482,7 +486,7 @@ public class FileUtil {
/**
* 获取用户路径(绝对路径)
- *
+ *
* @return 用户路径
* @since 4.0.6
*/
@@ -492,7 +496,7 @@ public class FileUtil {
/**
* 获取用户目录
- *
+ *
* @return 用户目录
* @since 4.0.6
*/
@@ -502,29 +506,29 @@ public class FileUtil {
/**
* 判断文件是否存在,如果path为null,则返回false
- *
+ *
* @param path 文件路径
* @return 如果存在返回true
*/
public static boolean exist(String path) {
- return (path == null) ? false : file(path).exists();
+ return (null != path) && file(path).exists();
}
/**
* 判断文件是否存在,如果file为null,则返回false
- *
+ *
* @param file 文件
* @return 如果存在返回true
*/
public static boolean exist(File file) {
- return (file == null) ? false : file.exists();
+ return (null != file) && file.exists();
}
/**
* 是否存在匹配文件
- *
+ *
* @param directory 文件夹路径
- * @param regexp 文件夹中所包含文件名的正则表达式
+ * @param regexp 文件夹中所包含文件名的正则表达式
* @return 如果存在匹配文件返回true
*/
public static boolean exist(String directory, String regexp) {
@@ -549,7 +553,7 @@ public class FileUtil {
/**
* 指定文件最后修改时间
- *
+ *
* @param file 文件
* @return 最后修改时间
*/
@@ -563,7 +567,7 @@ public class FileUtil {
/**
* 指定路径文件最后修改时间
- *
+ *
* @param path 绝对路径
* @return 最后修改时间
*/
@@ -575,7 +579,7 @@ public class FileUtil {
* 计算目录或文件的总大小
* 当给定对象为文件时,直接调用 {@link File#length()}
* 当给定对象为目录时,遍历目录下的所有文件和目录,递归计算其大小,求和返回
- *
+ *
* @param file 目录或文件
* @return 总大小,bytes长度
*/
@@ -602,8 +606,8 @@ public class FileUtil {
/**
* 给定文件或目录的最后修改时间是否晚于给定时间
- *
- * @param file 文件或目录
+ *
+ * @param file 文件或目录
* @param reference 参照文件
* @return 是否晚于给定时间
*/
@@ -616,8 +620,8 @@ public class FileUtil {
/**
* 给定文件或目录的最后修改时间是否晚于给定时间
- *
- * @param file 文件或目录
+ *
+ * @param file 文件或目录
* @param timeMillis 做为对比的时间
* @return 是否晚于给定时间
*/
@@ -631,7 +635,7 @@ public class FileUtil {
/**
* 创建文件及其父目录,如果这个文件存在,直接返回这个文件
* 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
- *
+ *
* @param fullFilePath 文件的全路径,使用POSIX风格
* @return 文件,若路径为null,返回null
* @throws IORuntimeException IO异常
@@ -646,7 +650,7 @@ public class FileUtil {
/**
* 创建文件及其父目录,如果这个文件存在,直接返回这个文件
* 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
- *
+ *
* @param file 文件对象
* @return 文件,若路径为null,返回null
* @throws IORuntimeException IO异常
@@ -669,9 +673,9 @@ public class FileUtil {
/**
* 创建文件及其父目录,如果这个文件存在,直接返回这个文件
* 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
- *
+ *
* @param parent 父文件对象
- * @param path 文件路径
+ * @param path 文件路径
* @return File
* @throws IORuntimeException IO异常
*/
@@ -682,9 +686,9 @@ public class FileUtil {
/**
* 创建文件及其父目录,如果这个文件存在,直接返回这个文件
* 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
- *
+ *
* @param parent 父文件对象
- * @param path 文件路径
+ * @param path 文件路径
* @return File
* @throws IORuntimeException IO异常
*/
@@ -694,7 +698,7 @@ public class FileUtil {
/**
* 创建所给文件或目录的父目录
- *
+ *
* @param file 文件或目录
* @return 父目录
*/
@@ -708,7 +712,7 @@ public class FileUtil {
/**
* 创建父文件夹,如果存在直接返回此文件夹
- *
+ *
* @param path 文件夹路径,使用POSIX格式,无论哪个平台
* @return 创建的目录
*/
@@ -723,7 +727,7 @@ public class FileUtil {
* 删除文件或者文件夹
* 路径如果为相对路径,会转换为ClassPath路径! 注意:删除文件夹时不会判断文件夹是否为空,如果不空则递归删除子文件或文件夹
* 某个文件删除失败会终止删除操作
- *
+ *
* @param fullFileOrDirPath 文件或者目录的路径
* @return 成功与否
* @throws IORuntimeException IO异常
@@ -736,7 +740,7 @@ public class FileUtil {
* 删除文件或者文件夹
* 注意:删除文件夹时不会判断文件夹是否为空,如果不空则递归删除子文件或文件夹
* 某个文件删除失败会终止删除操作
- *
+ *
* @param file 文件对象
* @return 成功与否
* @throws IORuntimeException IO异常
@@ -763,7 +767,7 @@ public class FileUtil {
* 删除文件或者文件夹
* 注意:删除文件夹时不会判断文件夹是否为空,如果不空则递归删除子文件或文件夹
* 某个文件删除失败会终止删除操作
- *
+ *
* @param path 文件对象
* @return 成功与否
* @throws IORuntimeException IO异常
@@ -807,7 +811,7 @@ public class FileUtil {
* 清空文件夹
* 注意:清空文件夹时不会判断文件夹是否为空,如果不空则递归删除子文件或文件夹
* 某个文件删除失败会终止删除操作
- *
+ *
* @param dirPath 文件夹路径
* @return 成功与否
* @throws IORuntimeException IO异常
@@ -821,7 +825,7 @@ public class FileUtil {
* 清空文件夹
* 注意:清空文件夹时不会判断文件夹是否为空,如果不空则递归删除子文件或文件夹
* 某个文件删除失败会终止删除操作
- *
+ *
* @param directory 文件夹
* @return 成功与否
* @throws IORuntimeException IO异常
@@ -833,12 +837,14 @@ public class FileUtil {
}
final File[] files = directory.listFiles();
- boolean isOk;
- for (File childFile : files) {
- isOk = del(childFile);
- if (isOk == false) {
- // 删除一个出错则本次删除任务失败
- return false;
+ if (null != files) {
+ boolean isOk;
+ for (File childFile : files) {
+ isOk = del(childFile);
+ if (isOk == false) {
+ // 删除一个出错则本次删除任务失败
+ return false;
+ }
}
}
return true;
@@ -848,7 +854,7 @@ public class FileUtil {
* 清理空文件夹
* 此方法用于递归删除空的文件夹,不删除文件
* 如果传入的文件夹本身就是空的,删除这个文件夹
- *
+ *
* @param directory 文件夹
* @return 成功与否
* @throws IORuntimeException IO异常
@@ -863,9 +869,10 @@ public class FileUtil {
if (ArrayUtil.isEmpty(files)) {
// 空文件夹则删除之
directory.delete();
- }
- for (File childFile : files) {
- cleanEmpty(childFile);
+ } else {
+ for (File childFile : files) {
+ cleanEmpty(childFile);
+ }
}
return true;
}
@@ -873,7 +880,7 @@ public class FileUtil {
/**
* 创建文件夹,如果存在直接返回此文件夹
* 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
- *
+ *
* @param dirPath 文件夹路径,使用POSIX格式,无论哪个平台
* @return 创建的目录
*/
@@ -888,7 +895,7 @@ public class FileUtil {
/**
* 创建文件夹,会递归自动创建其不存在的父文件夹,如果存在直接返回此文件夹
* 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
- *
+ *
* @param dir 目录
* @return 创建的目录
*/
@@ -905,7 +912,7 @@ public class FileUtil {
/**
* 创建临时文件
* 创建后的文件名为 prefix[Randon].tmp
- *
+ *
* @param dir 临时文件创建的所在目录
* @return 临时文件
* @throws IORuntimeException IO异常
@@ -917,8 +924,8 @@ public class FileUtil {
/**
* 创建临时文件
* 创建后的文件名为 prefix[Randon].tmp
- *
- * @param dir 临时文件创建的所在目录
+ *
+ * @param dir 临时文件创建的所在目录
* @param isReCreat 是否重新创建文件(删掉原来的,创建新的)
* @return 临时文件
* @throws IORuntimeException IO异常
@@ -930,10 +937,10 @@ public class FileUtil {
/**
* 创建临时文件
* 创建后的文件名为 prefix[Randon].suffix From com.jodd.io.FileUtil
- *
- * @param prefix 前缀,至少3个字符
- * @param suffix 后缀,如果null则使用默认.tmp
- * @param dir 临时文件创建的所在目录
+ *
+ * @param prefix 前缀,至少3个字符
+ * @param suffix 后缀,如果null则使用默认.tmp
+ * @param dir 临时文件创建的所在目录
* @param isReCreat 是否重新创建文件(删掉原来的,创建新的)
* @return 临时文件
* @throws IORuntimeException IO异常
@@ -958,9 +965,9 @@ public class FileUtil {
/**
* 通过JDK7+的 {@link Files#copy(Path, Path, CopyOption...)} 方法拷贝文件
- *
- * @param src 源文件路径
- * @param dest 目标文件或目录路径,如果为目录使用与源文件相同的文件名
+ *
+ * @param src 源文件路径
+ * @param dest 目标文件或目录路径,如果为目录使用与源文件相同的文件名
* @param options {@link StandardCopyOption}
* @return File
* @throws IORuntimeException IO异常
@@ -973,9 +980,9 @@ public class FileUtil {
/**
* 通过JDK7+的 {@link Files#copy(Path, Path, CopyOption...)} 方法拷贝文件
- *
- * @param src 源文件
- * @param dest 目标文件或目录,如果为目录使用与源文件相同的文件名
+ *
+ * @param src 源文件
+ * @param dest 目标文件或目录,如果为目录使用与源文件相同的文件名
* @param options {@link StandardCopyOption}
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -995,9 +1002,9 @@ public class FileUtil {
/**
* 通过JDK7+的 {@link Files#copy(Path, Path, CopyOption...)} 方法拷贝文件
- *
- * @param src 源文件路径
- * @param dest 目标文件或目录,如果为目录使用与源文件相同的文件名
+ *
+ * @param src 源文件路径
+ * @param dest 目标文件或目录,如果为目录使用与源文件相同的文件名
* @param options {@link StandardCopyOption}
* @return Path
* @throws IORuntimeException IO异常
@@ -1017,9 +1024,9 @@ public class FileUtil {
/**
* 复制文件或目录
* 如果目标文件为目录,则将源文件以相同文件名拷贝到目标目录
- *
- * @param srcPath 源文件或目录
- * @param destPath 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
+ *
+ * @param srcPath 源文件或目录
+ * @param destPath 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
* @param isOverride 是否覆盖目标文件
* @return 目标目录或文件
* @throws IORuntimeException IO异常
@@ -1031,15 +1038,15 @@ public class FileUtil {
/**
* 复制文件或目录
* 情况如下:
- *
+ *
*
* 1、src和dest都为目录,则将src目录及其目录下所有文件目录拷贝到dest下
* 2、src和dest都为文件,直接复制,名字为dest
* 3、src为文件,dest为目录,将src拷贝到dest目录下
*
- *
- * @param src 源文件
- * @param dest 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
+ *
+ * @param src 源文件
+ * @param dest 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
* @param isOverride 是否覆盖目标文件
* @return 目标目录或文件
* @throws IORuntimeException IO异常
@@ -1051,15 +1058,15 @@ public class FileUtil {
/**
* 复制文件或目录
* 情况如下:
- *
+ *
*
* 1、src和dest都为目录,则讲src下所有文件目录拷贝到dest下
* 2、src和dest都为文件,直接复制,名字为dest
* 3、src为文件,dest为目录,将src拷贝到dest目录下
*
- *
- * @param src 源文件
- * @param dest 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
+ *
+ * @param src 源文件
+ * @param dest 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
* @param isOverride 是否覆盖目标文件
* @return 目标目录或文件
* @throws IORuntimeException IO异常
@@ -1071,15 +1078,15 @@ public class FileUtil {
/**
* 复制文件或目录
* 情况如下:
- *
+ *
*
* 1、src和dest都为目录,则讲src下所有文件(包括子目录)拷贝到dest下
* 2、src和dest都为文件,直接复制,名字为dest
* 3、src为文件,dest为目录,将src拷贝到dest目录下
*
- *
- * @param src 源文件
- * @param dest 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
+ *
+ * @param src 源文件
+ * @param dest 目标文件或目录,目标不存在会自动创建(目录、文件都创建)
* @param isOverride 是否覆盖目标文件
* @return 目标目录或文件
* @throws IORuntimeException IO异常
@@ -1091,9 +1098,9 @@ public class FileUtil {
/**
* 移动文件或者目录
- *
- * @param src 源文件或者目录
- * @param dest 目标文件或者目录
+ *
+ * @param src 源文件或者目录
+ * @param dest 目标文件或者目录
* @param isOverride 是否覆盖目标,只有目标为文件才覆盖
* @throws IORuntimeException IO异常
*/
@@ -1133,21 +1140,21 @@ public class FileUtil {
* 修改文件或目录的文件名,不变更路径,只是简单修改文件名
* 重命名有两种模式:
* 1、isRetainExt为true时,保留原扩展名:
- *
+ *
*
* FileUtil.rename(file, "aaa", true) xx/xx.png =》xx/aaa.png
*
- *
+ *
* 2、isRetainExt为false时,不保留原扩展名,需要在newName中
- *
+ *
*
* FileUtil.rename(file, "aaa.jpg", false) xx/xx.png =》xx/aaa.jpg
*
- *
- * @param file 被修改的文件
- * @param newName 新的文件名,包括扩展名
+ *
+ * @param file 被修改的文件
+ * @param newName 新的文件名,包括扩展名
* @param isRetainExt 是否保留原文件的扩展名,如果保留,则newName不需要加扩展名
- * @param isOverride 是否覆盖目标文件
+ * @param isOverride 是否覆盖目标文件
* @return 目标文件
* @since 3.0.9
*/
@@ -1156,7 +1163,7 @@ public class FileUtil {
newName = newName.concat(".").concat(FileUtil.extName(file));
}
final Path path = file.toPath();
- final CopyOption[] options = isOverride ? new CopyOption[] { StandardCopyOption.REPLACE_EXISTING } : new CopyOption[] {};
+ final CopyOption[] options = isOverride ? new CopyOption[]{StandardCopyOption.REPLACE_EXISTING} : new CopyOption[]{};
try {
return Files.move(path, path.resolveSibling(newName), options).toFile();
} catch (IOException e) {
@@ -1166,7 +1173,7 @@ public class FileUtil {
/**
* 获取规范的绝对路径
- *
+ *
* @param file 文件
* @return 规范绝对路径,如果传入file为null,返回null
* @since 4.1.4
@@ -1185,8 +1192,8 @@ public class FileUtil {
/**
* 获取绝对路径
* 此方法不会判定给定路径是否有效(文件或目录存在)
- *
- * @param path 相对路径
+ *
+ * @param path 相对路径
* @param baseClass 相对路径所相对的类
* @return 绝对路径
*/
@@ -1218,14 +1225,14 @@ public class FileUtil {
}
// 资源不存在的情况下使用标准化路径有问题,使用原始路径拼接后标准化路径
- return normalize(classPath.concat(path));
+ return normalize(classPath.concat(Objects.requireNonNull(path)));
}
/**
* 获取绝对路径,相对于ClassPath的目录
* 如果给定就是绝对路径,则返回原路径,原路径把所有\替换为/
* 兼容Spring风格的路径表示,例如:classpath:config/example.setting也会被识别后转换
- *
+ *
* @param path 相对路径
* @return 绝对路径
*/
@@ -1235,7 +1242,7 @@ public class FileUtil {
/**
* 获取标准的绝对路径
- *
+ *
* @param file 文件
* @return 绝对路径
*/
@@ -1254,7 +1261,7 @@ public class FileUtil {
/**
* 给定路径已经是绝对路径
* 此方法并没有针对路径做标准化,建议先执行{@link #normalize(String)}方法标准化路径后判断
- *
+ *
* @param path 需要检查的Path
* @return 是否已经是绝对路径
*/
@@ -1263,37 +1270,34 @@ public class FileUtil {
return false;
}
- if (StrUtil.C_SLASH == path.charAt(0) || path.matches("^[a-zA-Z]:[/\\\\].*")) {
- // 给定的路径已经是绝对路径了
- return true;
- }
- return false;
+ // 给定的路径已经是绝对路径了
+ return StrUtil.C_SLASH == path.charAt(0) || path.matches("^[a-zA-Z]:[/\\\\].*");
}
/**
* 判断是否为目录,如果path为null,则返回false
- *
+ *
* @param path 文件路径
* @return 如果为目录true
*/
public static boolean isDirectory(String path) {
- return (path == null) ? false : file(path).isDirectory();
+ return (null != path) && file(path).isDirectory();
}
/**
* 判断是否为目录,如果file为null,则返回false
- *
+ *
* @param file 文件
* @return 如果为目录true
*/
public static boolean isDirectory(File file) {
- return (file == null) ? false : file.isDirectory();
+ return (null != file) && file.isDirectory();
}
/**
* 判断是否为目录,如果file为null,则返回false
- *
- * @param path {@link Path}
+ *
+ * @param path {@link Path}
* @param isFollowLinks 是否追踪到软链对应的真实地址
* @return 如果为目录true
* @since 3.1.0
@@ -1302,34 +1306,34 @@ public class FileUtil {
if (null == path) {
return false;
}
- final LinkOption[] options = isFollowLinks ? new LinkOption[0] : new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
+ final LinkOption[] options = isFollowLinks ? new LinkOption[0] : new LinkOption[]{LinkOption.NOFOLLOW_LINKS};
return Files.isDirectory(path, options);
}
/**
* 判断是否为文件,如果path为null,则返回false
- *
+ *
* @param path 文件路径
* @return 如果为文件true
*/
public static boolean isFile(String path) {
- return (path == null) ? false : file(path).isFile();
+ return (null != path) && file(path).isFile();
}
/**
* 判断是否为文件,如果file为null,则返回false
- *
+ *
* @param file 文件
* @return 如果为文件true
*/
public static boolean isFile(File file) {
- return (file == null) ? false : file.isFile();
+ return (null != file) && file.isFile();
}
/**
* 判断是否为文件,如果file为null,则返回false
- *
- * @param path 文件
+ *
+ * @param path 文件
* @param isFollowLinks 是否跟踪软链(快捷方式)
* @return 如果为文件true
*/
@@ -1337,14 +1341,14 @@ public class FileUtil {
if (null == path) {
return false;
}
- final LinkOption[] options = isFollowLinks ? new LinkOption[0] : new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
+ final LinkOption[] options = isFollowLinks ? new LinkOption[0] : new LinkOption[]{LinkOption.NOFOLLOW_LINKS};
return Files.isRegularFile(path, options);
}
/**
* 检查两个文件是否是同一个文件
* 所谓文件相同,是指File对象是否指向同一个文件或文件夹
- *
+ *
* @param file1 文件1
* @param file2 文件2
* @return 是否相同
@@ -1355,12 +1359,10 @@ public class FileUtil {
Assert.notNull(file1);
Assert.notNull(file2);
if (false == file1.exists() || false == file2.exists()) {
- // 两个文件都不存在判断其路径是否相同
- if (false == file1.exists() && false == file2.exists() && pathEquals(file1, file2)) {
- return true;
- }
- // 对于一个存在一个不存在的情况,一定不相同
- return false;
+ // 两个文件都不存在判断其路径是否相同, 对于一个存在一个不存在的情况,一定不相同
+ return false == file1.exists()//
+ && false == file2.exists()//
+ && pathEquals(file1, file2);
}
try {
return Files.isSameFile(file1.toPath(), file2.toPath());
@@ -1420,13 +1422,14 @@ public class FileUtil {
}
// -----------------------------------------------------------------------
+
/**
* 比较两个文件内容是否相同
* 首先比较长度,长度一致再比较内容,比较内容采用按行读取,每行比较
* 此方法来自Apache Commons io
*
- * @param file1 文件1
- * @param file2 文件2
+ * @param file1 文件1
+ * @param file2 文件2
* @param charset 编码,null表示使用平台默认编码 两个文件内容一致返回true,否则false
* @throws IORuntimeException IO异常
* @since 4.0.6
@@ -1467,7 +1470,7 @@ public class FileUtil {
/**
* 文件路径是否相同
* 取两个文件的绝对路径比较,在Windows下忽略大小写,在Linux下不忽略。
- *
+ *
* @param file1 文件1
* @param file2 文件2
* @return 文件路径是否相同
@@ -1502,7 +1505,7 @@ public class FileUtil {
/**
* 获得最后一个文件路径分隔符的位置
- *
+ *
* @param filePath 文件路径
* @return 最后一个文件路径分隔符的位置
*/
@@ -1523,8 +1526,8 @@ public class FileUtil {
/**
* 判断文件是否被改动
* 如果文件对象为 null 或者文件不存在,被视为改动
- *
- * @param file 文件对象
+ *
+ * @param file 文件对象
* @param lastModifyTime 上次的改动时间
* @return 是否被改动
*/
@@ -1544,9 +1547,9 @@ public class FileUtil {
* 3. 去除两边空格
* 4. .. 和 . 转换为绝对路径,当..多于已有路径时,直接返回根路径
*
- *
+ *
* 栗子:
- *
+ *
*
* "/foo//" =》 "/foo/"
* "/foo/./" =》 "/foo/"
@@ -1564,7 +1567,7 @@ public class FileUtil {
* "~/foo/../bar/" =》 "~/bar/"
* "~/../bar" =》 "bar"
*
- *
+ *
* @param path 原路径
* @return 修复后的路径
*/
@@ -1602,23 +1605,24 @@ public class FileUtil {
}
List pathList = StrUtil.split(pathToUse, StrUtil.C_SLASH);
- List pathElements = new LinkedList();
+ List pathElements = new LinkedList<>();
int tops = 0;
String element;
for (int i = pathList.size() - 1; i >= 0; i--) {
element = pathList.get(i);
- if (StrUtil.DOT.equals(element)) {
- // 当前目录,丢弃
- } else if (StrUtil.DOUBLE_DOT.equals(element)) {
- tops++;
- } else {
- if (tops > 0) {
- // 有上级目录标记时按照个数依次跳过
- tops--;
+ // 只处理非.的目录,既只处理非当前目录
+ if (false == StrUtil.DOT.equals(element)) {
+ if (StrUtil.DOUBLE_DOT.equals(element)) {
+ tops++;
} else {
- // Normal path element found.
- pathElements.add(0, element);
+ if (tops > 0) {
+ // 有上级目录标记时按照个数依次跳过
+ tops--;
+ } else {
+ // Normal path element found.
+ pathElements.add(0, element);
+ }
}
}
}
@@ -1628,16 +1632,16 @@ public class FileUtil {
/**
* 获得相对子路径
- *
+ *
* 栗子:
- *
+ *
*
* dirPath: d:/aaa/bbb filePath: d:/aaa/bbb/ccc =》 ccc
* dirPath: d:/Aaa/bbb filePath: d:/aaa/bbb/ccc.txt =》 ccc.txt
*
- *
+ *
* @param rootDir 绝对父路径
- * @param file 文件
+ * @param file 文件
* @return 相对子路径
*/
public static String subPath(String rootDir, File file) {
@@ -1650,16 +1654,16 @@ public class FileUtil {
/**
* 获得相对子路径,忽略大小写
- *
+ *
* 栗子:
- *
+ *
*
* dirPath: d:/aaa/bbb filePath: d:/aaa/bbb/ccc =》 ccc
* dirPath: d:/Aaa/bbb filePath: d:/aaa/bbb/ccc.txt =》 ccc.txt
* dirPath: d:/Aaa/bbb filePath: d:/aaa/bbb/ =》 ""
*
- *
- * @param dirPath 父路径
+ *
+ * @param dirPath 父路径
* @param filePath 文件路径
* @return 相对子路径
*/
@@ -1677,8 +1681,8 @@ public class FileUtil {
/**
* 获取指定位置的子路径部分,支持负数,例如index为-1表示从后数第一个节点位置
- *
- * @param path 路径
+ *
+ * @param path 路径
* @param index 路径节点位置,支持负数(负数从后向前计数)
* @return 获取的子路径
* @since 3.1.2
@@ -1689,7 +1693,7 @@ public class FileUtil {
/**
* 获取指定位置的最后一个子路径部分
- *
+ *
* @param path 路径
* @return 获取的最后一个子路径
* @since 3.1.2
@@ -1700,10 +1704,10 @@ public class FileUtil {
/**
* 获取指定位置的子路径部分,支持负数,例如起始为-1表示从后数第一个节点位置
- *
- * @param path 路径
+ *
+ * @param path 路径
* @param fromIndex 起始路径节点(包括)
- * @param toIndex 结束路径节点(不包括)
+ * @param toIndex 结束路径节点(不包括)
* @return 获取的子路径
* @since 3.1.2
*/
@@ -1744,9 +1748,10 @@ public class FileUtil {
}
// -------------------------------------------------------------------------------------------- name start
+
/**
* 返回文件名
- *
+ *
* @param file 文件
* @return 文件名
* @since 4.1.13
@@ -1757,7 +1762,7 @@ public class FileUtil {
/**
* 返回文件名
- *
+ *
* @param filePath 文件
* @return 文件名
* @since 4.1.13
@@ -1791,7 +1796,7 @@ public class FileUtil {
/**
* 返回主文件名
- *
+ *
* @param file 文件
* @return 主文件名
*/
@@ -1804,13 +1809,13 @@ public class FileUtil {
/**
* 返回主文件名
- *
+ *
* @param fileName 完整文件名
* @return 主文件名
*/
public static String mainName(String fileName) {
if (null == fileName) {
- return fileName;
+ return null;
}
int len = fileName.length();
if (0 == len) {
@@ -1823,18 +1828,16 @@ public class FileUtil {
int begin = 0;
int end = len;
char c;
- for (int i = len - 1; i > -1; i--) {
+ for (int i = len - 1; i >= 0; i--) {
c = fileName.charAt(i);
if (len == end && CharUtil.DOT == c) {
// 查找最后一个文件名和扩展名的分隔符:.
end = i;
}
- if (0 == begin || begin > end) {
- if (CharUtil.isFileSeparator(c)) {
- // 查找最后一个路径分隔符(/或者\),如果这个分隔符在.之后,则继续查找,否则结束
- begin = i + 1;
- break;
- }
+ // 查找最后一个路径分隔符(/或者\),如果这个分隔符在.之后,则继续查找,否则结束
+ if (CharUtil.isFileSeparator(c)) {
+ begin = i + 1;
+ break;
}
}
@@ -1843,7 +1846,7 @@ public class FileUtil {
/**
* 获取文件扩展名,扩展名不带“.”
- *
+ *
* @param file 文件
* @return 扩展名
*/
@@ -1859,7 +1862,7 @@ public class FileUtil {
/**
* 获得文件的扩展名,扩展名不带“.”
- *
+ *
* @param fileName 文件名
* @return 扩展名
*/
@@ -1881,8 +1884,8 @@ public class FileUtil {
/**
* 判断文件路径是否有指定后缀,忽略大小写
* 常用语判断扩展名
- *
- * @param file 文件或目录
+ *
+ * @param file 文件或目录
* @param suffix 后缀
* @return 是否有指定后缀
*/
@@ -1892,12 +1895,11 @@ public class FileUtil {
/**
* 根据文件流的头部信息获得文件类型
- *
- * @see FileTypeUtil#getType(File)
- *
+ *
* @param file 文件 {@link File}
* @return 类型,文件的扩展名,未找到为null
* @throws IORuntimeException IO异常
+ * @see FileTypeUtil#getType(File)
*/
public static String getType(File file) throws IORuntimeException {
return FileTypeUtil.getType(file);
@@ -1905,8 +1907,8 @@ public class FileUtil {
/**
* 获取文件属性
- *
- * @param path 文件路径{@link Path}
+ *
+ * @param path 文件路径{@link Path}
* @param isFollowLinks 是否跟踪到软链对应的真实路径
* @return {@link BasicFileAttributes}
* @throws IORuntimeException IO异常
@@ -1917,7 +1919,7 @@ public class FileUtil {
return null;
}
- final LinkOption[] options = isFollowLinks ? new LinkOption[0] : new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
+ final LinkOption[] options = isFollowLinks ? new LinkOption[0] : new LinkOption[]{LinkOption.NOFOLLOW_LINKS};
try {
return Files.readAttributes(path, BasicFileAttributes.class, options);
} catch (IOException e) {
@@ -1926,9 +1928,10 @@ public class FileUtil {
}
// -------------------------------------------------------------------------------------------- in start
+
/**
* 获得输入流
- *
+ *
* @param path Path
* @return 输入流
* @throws IORuntimeException 文件未找到
@@ -1944,7 +1947,7 @@ public class FileUtil {
/**
* 获得输入流
- *
+ *
* @param file 文件
* @return 输入流
* @throws IORuntimeException 文件未找到
@@ -1955,7 +1958,7 @@ public class FileUtil {
/**
* 获得输入流
- *
+ *
* @param path 文件路径
* @return 输入流
* @throws IORuntimeException 文件未找到
@@ -1966,7 +1969,7 @@ public class FileUtil {
/**
* 获得BOM输入流,用于处理带BOM头的文件
- *
+ *
* @param file 文件
* @return 输入流
* @throws IORuntimeException 文件未找到
@@ -1981,7 +1984,7 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
+ *
* @param path 文件Path
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -1993,7 +1996,7 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
+ *
* @param file 文件
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2004,7 +2007,7 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
+ *
* @param path 文件路径
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2015,8 +2018,8 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
- * @param path 文件Path
+ *
+ * @param path 文件Path
* @param charset 字符集
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2028,8 +2031,8 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charsetName 字符集
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2040,8 +2043,8 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charset 字符集
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2052,8 +2055,8 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
- * @param path 绝对路径
+ *
+ * @param path 绝对路径
* @param charsetName 字符集
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2064,8 +2067,8 @@ public class FileUtil {
/**
* 获得一个文件读取器
- *
- * @param path 绝对路径
+ *
+ * @param path 绝对路径
* @param charset 字符集
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2079,7 +2082,7 @@ public class FileUtil {
/**
* 读取文件所有数据
* 文件的长度不能超过Integer.MAX_VALUE
- *
+ *
* @param file 文件
* @return 字节码
* @throws IORuntimeException IO异常
@@ -2091,7 +2094,7 @@ public class FileUtil {
/**
* 读取文件所有数据
* 文件的长度不能超过Integer.MAX_VALUE
- *
+ *
* @param filePath 文件路径
* @return 字节码
* @throws IORuntimeException IO异常
@@ -2103,7 +2106,7 @@ public class FileUtil {
/**
* 读取文件内容
- *
+ *
* @param file 文件
* @return 内容
* @throws IORuntimeException IO异常
@@ -2114,7 +2117,7 @@ public class FileUtil {
/**
* 读取文件内容
- *
+ *
* @param path 文件路径
* @return 内容
* @throws IORuntimeException IO异常
@@ -2125,8 +2128,8 @@ public class FileUtil {
/**
* 读取文件内容
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charsetName 字符集
* @return 内容
* @throws IORuntimeException IO异常
@@ -2137,8 +2140,8 @@ public class FileUtil {
/**
* 读取文件内容
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charset 字符集
* @return 内容
* @throws IORuntimeException IO异常
@@ -2149,8 +2152,8 @@ public class FileUtil {
/**
* 读取文件内容
- *
- * @param path 文件路径
+ *
+ * @param path 文件路径
* @param charsetName 字符集
* @return 内容
* @throws IORuntimeException IO异常
@@ -2161,8 +2164,8 @@ public class FileUtil {
/**
* 读取文件内容
- *
- * @param path 文件路径
+ *
+ * @param path 文件路径
* @param charset 字符集
* @return 内容
* @throws IORuntimeException IO异常
@@ -2173,8 +2176,8 @@ public class FileUtil {
/**
* 读取文件内容
- *
- * @param url 文件URL
+ *
+ * @param url 文件URL
* @param charset 字符集
* @return 内容
* @throws IORuntimeException IO异常
@@ -2197,9 +2200,9 @@ public class FileUtil {
/**
* 从文件中读取每一行的UTF-8编码数据
- *
- * @param 集合类型
- * @param path 文件路径
+ *
+ * @param 集合类型
+ * @param path 文件路径
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2211,10 +2214,10 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param 集合类型
- * @param path 文件路径
- * @param charset 字符集
+ *
+ * @param 集合类型
+ * @param path 文件路径
+ * @param charset 字符集
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2225,10 +2228,10 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param 集合类型
- * @param path 文件路径
- * @param charset 字符集
+ *
+ * @param 集合类型
+ * @param path 文件路径
+ * @param charset 字符集
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2239,9 +2242,9 @@ public class FileUtil {
/**
* 从文件中读取每一行数据,数据编码为UTF-8
- *
- * @param 集合类型
- * @param file 文件路径
+ *
+ * @param 集合类型
+ * @param file 文件路径
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2253,10 +2256,10 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param 集合类型
- * @param file 文件路径
- * @param charset 字符集
+ *
+ * @param 集合类型
+ * @param file 文件路径
+ * @param charset 字符集
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2267,10 +2270,10 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param 集合类型
- * @param file 文件路径
- * @param charset 字符集
+ *
+ * @param 集合类型
+ * @param file 文件路径
+ * @param charset 字符集
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2281,9 +2284,9 @@ public class FileUtil {
/**
* 从文件中读取每一行数据,编码为UTF-8
- *
- * @param 集合类型
- * @param url 文件的URL
+ *
+ * @param 集合类型
+ * @param url 文件的URL
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2294,11 +2297,11 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param 集合类型
- * @param url 文件的URL
+ *
+ * @param 集合类型
+ * @param url 文件的URL
* @param charsetName 字符集
- * @param collection 集合
+ * @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
*/
@@ -2308,10 +2311,10 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param 集合类型
- * @param url 文件的URL
- * @param charset 字符集
+ *
+ * @param 集合类型
+ * @param url 文件的URL
+ * @param charset 字符集
* @param collection 集合
* @return 文件中的每行内容的集合
* @throws IORuntimeException IO异常
@@ -2331,7 +2334,7 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
+ *
* @param url 文件的URL
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2342,8 +2345,8 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param url 文件的URL
+ *
+ * @param url 文件的URL
* @param charset 字符集
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2354,8 +2357,8 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param url 文件的URL
+ *
+ * @param url 文件的URL
* @param charset 字符集
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2366,7 +2369,7 @@ public class FileUtil {
/**
* 从文件中读取每一行数据,编码为UTF-8
- *
+ *
* @param path 文件路径
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2378,8 +2381,8 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param path 文件路径
+ *
+ * @param path 文件路径
* @param charset 字符集
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2390,8 +2393,8 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param path 文件路径
+ *
+ * @param path 文件路径
* @param charset 字符集
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2403,7 +2406,7 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
+ *
* @param file 文件
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2415,8 +2418,8 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charset 字符集
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2427,8 +2430,8 @@ public class FileUtil {
/**
* 从文件中读取每一行数据
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charset 字符集
* @return 文件中的每行内容的集合List
* @throws IORuntimeException IO异常
@@ -2439,8 +2442,8 @@ public class FileUtil {
/**
* 按行处理文件内容,编码为UTF-8
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param lineHandler {@link LineHandler}行处理器
* @throws IORuntimeException IO异常
*/
@@ -2450,9 +2453,9 @@ public class FileUtil {
/**
* 按行处理文件内容
- *
- * @param file 文件
- * @param charset 编码
+ *
+ * @param file 文件
+ * @param charset 编码
* @param lineHandler {@link LineHandler}行处理器
* @throws IORuntimeException IO异常
*/
@@ -2462,15 +2465,15 @@ public class FileUtil {
/**
* 按行处理文件内容
- *
- * @param file {@link RandomAccessFile}文件
- * @param charset 编码
+ *
+ * @param file {@link RandomAccessFile}文件
+ * @param charset 编码
* @param lineHandler {@link LineHandler}行处理器
* @throws IORuntimeException IO异常
* @since 4.5.2
*/
public static void readLines(RandomAccessFile file, Charset charset, LineHandler lineHandler) {
- String line = null;
+ String line;
try {
while ((line = file.readLine()) != null) {
lineHandler.handle(CharsetUtil.convert(line, CharsetUtil.CHARSET_ISO_8859_1, charset));
@@ -2482,9 +2485,9 @@ public class FileUtil {
/**
* 单行处理文件内容
- *
- * @param file {@link RandomAccessFile}文件
- * @param charset 编码
+ *
+ * @param file {@link RandomAccessFile}文件
+ * @param charset 编码
* @param lineHandler {@link LineHandler}行处理器
* @throws IORuntimeException IO异常
* @since 4.5.2
@@ -2498,15 +2501,15 @@ public class FileUtil {
/**
* 单行处理文件内容
- *
- * @param file {@link RandomAccessFile}文件
+ *
+ * @param file {@link RandomAccessFile}文件
* @param charset 编码
* @return 行内容
* @throws IORuntimeException IO异常
* @since 4.5.18
*/
public static String readLine(RandomAccessFile file, Charset charset) {
- String line = null;
+ String line;
try {
line = file.readLine();
} catch (IOException e) {
@@ -2521,11 +2524,11 @@ public class FileUtil {
/**
* 按照给定的readerHandler读取文件中的数据
- *
- * @param 集合类型
+ *
+ * @param 集合类型
* @param readerHandler Reader处理类
- * @param path 文件的绝对路径
- * @param charset 字符集
+ * @param path 文件的绝对路径
+ * @param charset 字符集
* @return 从文件中load出的数据
* @throws IORuntimeException IO异常
* @deprecated 使用FileUtil#load(String, String, ReaderHandler) 代替
@@ -2537,10 +2540,10 @@ public class FileUtil {
/**
* 按照给定的readerHandler读取文件中的数据
- *
- * @param 集合类型
+ *
+ * @param 集合类型
* @param readerHandler Reader处理类
- * @param path 文件的绝对路径
+ * @param path 文件的绝对路径
* @return 从文件中load出的数据
* @throws IORuntimeException IO异常
* @since 3.1.1
@@ -2551,11 +2554,11 @@ public class FileUtil {
/**
* 按照给定的readerHandler读取文件中的数据
- *
- * @param 集合类型
+ *
+ * @param 集合类型
* @param readerHandler Reader处理类
- * @param path 文件的绝对路径
- * @param charset 字符集
+ * @param path 文件的绝对路径
+ * @param charset 字符集
* @return 从文件中load出的数据
* @throws IORuntimeException IO异常
* @since 3.1.1
@@ -2566,11 +2569,11 @@ public class FileUtil {
/**
* 按照给定的readerHandler读取文件中的数据
- *
- * @param 集合类型
+ *
+ * @param 集合类型
* @param readerHandler Reader处理类
- * @param path 文件的绝对路径
- * @param charset 字符集
+ * @param path 文件的绝对路径
+ * @param charset 字符集
* @return 从文件中load出的数据
* @throws IORuntimeException IO异常
* @since 3.1.1
@@ -2581,10 +2584,10 @@ public class FileUtil {
/**
* 按照给定的readerHandler读取文件中的数据
- *
- * @param 集合类型
+ *
+ * @param 集合类型
* @param readerHandler Reader处理类
- * @param file 文件
+ * @param file 文件
* @return 从文件中load出的数据
* @throws IORuntimeException IO异常
* @since 3.1.1
@@ -2595,11 +2598,11 @@ public class FileUtil {
/**
* 按照给定的readerHandler读取文件中的数据
- *
- * @param 集合类型
+ *
+ * @param 集合类型
* @param readerHandler Reader处理类
- * @param file 文件
- * @param charset 字符集
+ * @param file 文件
+ * @param charset 字符集
* @return 从文件中load出的数据
* @throws IORuntimeException IO异常
* @since 3.1.1
@@ -2609,9 +2612,10 @@ public class FileUtil {
}
// -------------------------------------------------------------------------------------------- out start
+
/**
* 获得一个输出流对象
- *
+ *
* @param file 文件
* @return 输出流对象
* @throws IORuntimeException IO异常
@@ -2626,7 +2630,7 @@ public class FileUtil {
/**
* 获得一个输出流对象
- *
+ *
* @param path 输出到的文件路径,绝对路径
* @return 输出流对象
* @throws IORuntimeException IO异常
@@ -2637,10 +2641,10 @@ public class FileUtil {
/**
* 获得一个带缓存的写入对象
- *
- * @param path 输出路径,绝对路径
+ *
+ * @param path 输出路径,绝对路径
* @param charsetName 字符集
- * @param isAppend 是否追加
+ * @param isAppend 是否追加
* @return BufferedReader对象
* @throws IORuntimeException IO异常
*/
@@ -2650,9 +2654,9 @@ public class FileUtil {
/**
* 获得一个带缓存的写入对象
- *
- * @param path 输出路径,绝对路径
- * @param charset 字符集
+ *
+ * @param path 输出路径,绝对路径
+ * @param charset 字符集
* @param isAppend 是否追加
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2663,10 +2667,10 @@ public class FileUtil {
/**
* 获得一个带缓存的写入对象
- *
- * @param file 输出文件
+ *
+ * @param file 输出文件
* @param charsetName 字符集
- * @param isAppend 是否追加
+ * @param isAppend 是否追加
* @return BufferedReader对象
* @throws IORuntimeException IO异常
*/
@@ -2676,9 +2680,9 @@ public class FileUtil {
/**
* 获得一个带缓存的写入对象
- *
- * @param file 输出文件
- * @param charset 字符集
+ *
+ * @param file 输出文件
+ * @param charset 字符集
* @param isAppend 是否追加
* @return BufferedReader对象
* @throws IORuntimeException IO异常
@@ -2689,9 +2693,9 @@ public class FileUtil {
/**
* 获得一个打印写入对象,可以有print
- *
- * @param path 输出路径,绝对路径
- * @param charset 字符集
+ *
+ * @param path 输出路径,绝对路径
+ * @param charset 字符集
* @param isAppend 是否追加
* @return 打印对象
* @throws IORuntimeException IO异常
@@ -2702,9 +2706,9 @@ public class FileUtil {
/**
* 获得一个打印写入对象,可以有print
- *
- * @param path 输出路径,绝对路径
- * @param charset 字符集
+ *
+ * @param path 输出路径,绝对路径
+ * @param charset 字符集
* @param isAppend 是否追加
* @return 打印对象
* @throws IORuntimeException IO异常
@@ -2716,9 +2720,9 @@ public class FileUtil {
/**
* 获得一个打印写入对象,可以有print
- *
- * @param file 文件
- * @param charset 字符集
+ *
+ * @param file 文件
+ * @param charset 字符集
* @param isAppend 是否追加
* @return 打印对象
* @throws IORuntimeException IO异常
@@ -2729,13 +2733,13 @@ public class FileUtil {
/**
* 获取当前系统的换行分隔符
- *
+ *
*
* Windows: \r\n
* Mac: \r
* Linux: \n
*
- *
+ *
* @return 换行符
* @since 4.0.5
*/
@@ -2748,9 +2752,9 @@ public class FileUtil {
/**
* 将String写入文件,覆盖模式,字符集为UTF-8
- *
+ *
* @param content 写入的内容
- * @param path 文件路径
+ * @param path 文件路径
* @return 写入的文件
* @throws IORuntimeException IO异常
*/
@@ -2760,9 +2764,9 @@ public class FileUtil {
/**
* 将String写入文件,覆盖模式,字符集为UTF-8
- *
+ *
* @param content 写入的内容
- * @param file 文件
+ * @param file 文件
* @return 写入的文件
* @throws IORuntimeException IO异常
*/
@@ -2772,9 +2776,9 @@ public class FileUtil {
/**
* 将String写入文件,覆盖模式
- *
+ *
* @param content 写入的内容
- * @param path 文件路径
+ * @param path 文件路径
* @param charset 字符集
* @return 写入的文件
* @throws IORuntimeException IO异常
@@ -2785,9 +2789,9 @@ public class FileUtil {
/**
* 将String写入文件,覆盖模式
- *
+ *
* @param content 写入的内容
- * @param path 文件路径
+ * @param path 文件路径
* @param charset 字符集
* @return 写入的文件
* @throws IORuntimeException IO异常
@@ -2798,10 +2802,9 @@ public class FileUtil {
/**
* 将String写入文件,覆盖模式
- *
- *
+ *
* @param content 写入的内容
- * @param file 文件
+ * @param file 文件
* @param charset 字符集
* @return 被写入的文件
* @throws IORuntimeException IO异常
@@ -2812,10 +2815,9 @@ public class FileUtil {
/**
* 将String写入文件,覆盖模式
- *
- *
+ *
* @param content 写入的内容
- * @param file 文件
+ * @param file 文件
* @param charset 字符集
* @return 被写入的文件
* @throws IORuntimeException IO异常
@@ -2826,9 +2828,9 @@ public class FileUtil {
/**
* 将String写入文件,UTF-8编码追加模式
- *
+ *
* @param content 写入的内容
- * @param path 文件路径
+ * @param path 文件路径
* @return 写入的文件
* @throws IORuntimeException IO异常
* @since 3.1.2
@@ -2839,9 +2841,9 @@ public class FileUtil {
/**
* 将String写入文件,追加模式
- *
+ *
* @param content 写入的内容
- * @param path 文件路径
+ * @param path 文件路径
* @param charset 字符集
* @return 写入的文件
* @throws IORuntimeException IO异常
@@ -2852,9 +2854,9 @@ public class FileUtil {
/**
* 将String写入文件,追加模式
- *
+ *
* @param content 写入的内容
- * @param path 文件路径
+ * @param path 文件路径
* @param charset 字符集
* @return 写入的文件
* @throws IORuntimeException IO异常
@@ -2865,9 +2867,9 @@ public class FileUtil {
/**
* 将String写入文件,UTF-8编码追加模式
- *
+ *
* @param content 写入的内容
- * @param file 文件
+ * @param file 文件
* @return 写入的文件
* @throws IORuntimeException IO异常
* @since 3.1.2
@@ -2878,9 +2880,9 @@ public class FileUtil {
/**
* 将String写入文件,追加模式
- *
+ *
* @param content 写入的内容
- * @param file 文件
+ * @param file 文件
* @param charset 字符集
* @return 写入的文件
* @throws IORuntimeException IO异常
@@ -2891,9 +2893,9 @@ public class FileUtil {
/**
* 将String写入文件,追加模式
- *
+ *
* @param content 写入的内容
- * @param file 文件
+ * @param file 文件
* @param charset 字符集
* @return 写入的文件
* @throws IORuntimeException IO异常
@@ -2904,8 +2906,8 @@ public class FileUtil {
/**
* 将列表写入文件,覆盖模式,编码为UTF-8
- *
- * @param 集合元素类型
+ *
+ * @param 集合元素类型
* @param list 列表
* @param path 绝对路径
* @return 目标文件
@@ -2918,8 +2920,8 @@ public class FileUtil {
/**
* 将列表写入文件,覆盖模式,编码为UTF-8
- *
- * @param 集合元素类型
+ *
+ * @param 集合元素类型
* @param list 列表
* @param file 绝对路径
* @return 目标文件
@@ -2932,10 +2934,10 @@ public class FileUtil {
/**
* 将列表写入文件,覆盖模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param path 绝对路径
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param path 绝对路径
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -2946,10 +2948,10 @@ public class FileUtil {
/**
* 将列表写入文件,覆盖模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param path 绝对路径
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param path 绝对路径
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -2960,10 +2962,10 @@ public class FileUtil {
/**
* 将列表写入文件,覆盖模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param file 文件
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param file 文件
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -2975,10 +2977,10 @@ public class FileUtil {
/**
* 将列表写入文件,覆盖模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param file 文件
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param file 文件
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -2990,8 +2992,8 @@ public class FileUtil {
/**
* 将列表写入文件,追加模式
- *
- * @param 集合元素类型
+ *
+ * @param 集合元素类型
* @param list 列表
* @param file 文件
* @return 目标文件
@@ -3004,8 +3006,8 @@ public class FileUtil {
/**
* 将列表写入文件,追加模式
- *
- * @param 集合元素类型
+ *
+ * @param 集合元素类型
* @param list 列表
* @param path 文件路径
* @return 目标文件
@@ -3018,10 +3020,10 @@ public class FileUtil {
/**
* 将列表写入文件,追加模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param path 绝对路径
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param path 绝对路径
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3032,10 +3034,10 @@ public class FileUtil {
/**
* 将列表写入文件,追加模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param file 文件
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param file 文件
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3047,10 +3049,10 @@ public class FileUtil {
/**
* 将列表写入文件,追加模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param path 绝对路径
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param path 绝对路径
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3061,10 +3063,10 @@ public class FileUtil {
/**
* 将列表写入文件,追加模式
- *
- * @param 集合元素类型
- * @param list 列表
- * @param file 文件
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param file 文件
* @param charset 字符集
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3076,11 +3078,11 @@ public class FileUtil {
/**
* 将列表写入文件
- *
- * @param 集合元素类型
- * @param list 列表
- * @param path 文件路径
- * @param charset 字符集
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param path 文件路径
+ * @param charset 字符集
* @param isAppend 是否追加
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3091,11 +3093,11 @@ public class FileUtil {
/**
* 将列表写入文件
- *
- * @param 集合元素类型
- * @param list 列表
- * @param path 文件路径
- * @param charset 字符集
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param path 文件路径
+ * @param charset 字符集
* @param isAppend 是否追加
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3106,11 +3108,11 @@ public class FileUtil {
/**
* 将列表写入文件
- *
- * @param 集合元素类型
- * @param list 列表
- * @param file 文件
- * @param charset 字符集
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param file 文件
+ * @param charset 字符集
* @param isAppend 是否追加
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3121,11 +3123,11 @@ public class FileUtil {
/**
* 将列表写入文件
- *
- * @param 集合元素类型
- * @param list 列表
- * @param file 文件
- * @param charset 字符集
+ *
+ * @param 集合元素类型
+ * @param list 列表
+ * @param file 文件
+ * @param charset 字符集
* @param isAppend 是否追加
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3136,11 +3138,11 @@ public class FileUtil {
/**
* 将Map写入文件,每个键值对为一行,一行中键与值之间使用kvSeparator分隔
- *
- * @param map Map
- * @param file 文件
+ *
+ * @param map Map
+ * @param file 文件
* @param kvSeparator 键和值之间的分隔符,如果传入null使用默认分隔符" = "
- * @param isAppend 是否追加
+ * @param isAppend 是否追加
* @return 目标文件
* @throws IORuntimeException IO异常
* @since 4.0.5
@@ -3151,12 +3153,12 @@ public class FileUtil {
/**
* 将Map写入文件,每个键值对为一行,一行中键与值之间使用kvSeparator分隔
- *
- * @param map Map
- * @param file 文件
- * @param charset 字符集编码
+ *
+ * @param map Map
+ * @param file 文件
+ * @param charset 字符集编码
* @param kvSeparator 键和值之间的分隔符,如果传入null使用默认分隔符" = "
- * @param isAppend 是否追加
+ * @param isAppend 是否追加
* @return 目标文件
* @throws IORuntimeException IO异常
* @since 4.0.5
@@ -3167,7 +3169,7 @@ public class FileUtil {
/**
* 写数据到文件中
- *
+ *
* @param data 数据
* @param path 目标文件
* @return 目标文件
@@ -3179,7 +3181,7 @@ public class FileUtil {
/**
* 写数据到文件中
- *
+ *
* @param dest 目标文件
* @param data 数据
* @return 目标文件
@@ -3191,11 +3193,11 @@ public class FileUtil {
/**
* 写入数据到文件
- *
- * @param data 数据
- * @param dest 目标文件
- * @param off 数据开始位置
- * @param len 数据长度
+ *
+ * @param data 数据
+ * @param dest 目标文件
+ * @param off 数据开始位置
+ * @param len 数据长度
* @param isAppend 是否追加模式
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3206,9 +3208,9 @@ public class FileUtil {
/**
* 将流的内容写入文件
- *
+ *
* @param dest 目标文件
- * @param in 输入流
+ * @param in 输入流
* @return dest
* @throws IORuntimeException IO异常
*/
@@ -3218,8 +3220,8 @@ public class FileUtil {
/**
* 将流的内容写入文件
- *
- * @param in 输入流
+ *
+ * @param in 输入流
* @param fullFilePath 文件绝对路径
* @return 目标文件
* @throws IORuntimeException IO异常
@@ -3230,9 +3232,9 @@ public class FileUtil {
/**
* 将文件写入流中
- *
+ *
* @param file 文件
- * @param out 流
+ * @param out 流
* @return 目标文件
* @throws IORuntimeException IO异常
*/
@@ -3242,9 +3244,9 @@ public class FileUtil {
/**
* 将流的内容写入文件
- *
+ *
* @param fullFilePath 文件绝对路径
- * @param out 输出流
+ * @param out 输出流
* @throws IORuntimeException IO异常
*/
public static void writeToStream(String fullFilePath, OutputStream out) throws IORuntimeException {
@@ -3253,7 +3255,7 @@ public class FileUtil {
/**
* 可读的文件大小
- *
+ *
* @param file 文件
* @return 大小
*/
@@ -3264,7 +3266,7 @@ public class FileUtil {
/**
* 可读的文件大小
* 参考 http://stackoverflow.com/questions/3263892/format-file-size-as-mb-gb-etc
- *
+ *
* @param size Long类型大小
* @return 大小
*/
@@ -3272,7 +3274,7 @@ public class FileUtil {
if (size <= 0) {
return "0";
}
- final String[] units = new String[] { "B", "kB", "MB", "GB", "TB", "EB" };
+ final String[] units = new String[]{"B", "kB", "MB", "GB", "TB", "EB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.##").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@@ -3280,9 +3282,9 @@ public class FileUtil {
/**
* 转换文件编码
* 此方法用于转换文件编码,读取的文件实际编码必须与指定的srcCharset编码一致,否则导致乱码
- *
- * @param file 文件
- * @param srcCharset 原文件的编码,必须与文件内容的编码保持一致
+ *
+ * @param file 文件
+ * @param srcCharset 原文件的编码,必须与文件内容的编码保持一致
* @param destCharset 转码后的编码
* @return 被转换编码的文件
* @see CharsetUtil#convert(File, Charset, Charset)
@@ -3295,9 +3297,9 @@ public class FileUtil {
/**
* 转换换行符
* 将给定文件的换行符转换为指定换行符
- *
- * @param file 文件
- * @param charset 编码
+ *
+ * @param file 文件
+ * @param charset 编码
* @param lineSeparator 换行符枚举{@link LineSeparator}
* @return 被修改的文件
* @since 3.1.0
@@ -3309,7 +3311,7 @@ public class FileUtil {
/**
* 清除文件名中的在Windows下不支持的非法字符,包括: \ / : * ? " < > |
- *
+ *
* @param fileName 文件名(必须不包括路径,否则路径符将被替换)
* @return 清理后的文件名
* @since 3.3.1
@@ -3320,18 +3322,18 @@ public class FileUtil {
/**
* 文件名中是否包含在Windows下不支持的非法字符,包括: \ / : * ? " < > |
- *
+ *
* @param fileName 文件名(必须不包括路径,否则路径符将被替换)
* @return 是否包含非法字符
* @since 3.3.1
*/
public static boolean containsInvalid(String fileName) {
- return StrUtil.isBlank(fileName) ? false : ReUtil.contains(FILE_NAME_INVALID_PATTERN_WIN, fileName);
+ return (false == StrUtil.isBlank(fileName)) && ReUtil.contains(FILE_NAME_INVALID_PATTERN_WIN, fileName);
}
/**
* 计算文件CRC32校验码
- *
+ *
* @param file 文件,不能为目录
* @return CRC32值
* @throws IORuntimeException IO异常
@@ -3343,8 +3345,8 @@ public class FileUtil {
/**
* 计算文件校验码
- *
- * @param file 文件,不能为目录
+ *
+ * @param file 文件,不能为目录
* @param checksum {@link Checksum}
* @return Checksum
* @throws IORuntimeException IO异常
@@ -3365,7 +3367,7 @@ public class FileUtil {
/**
* 获取Web项目下的web root路径
* 原理是首先获取ClassPath路径,由于在web项目中ClassPath位于 WEB-INF/classes/下,故向上获取两级目录即可。
- *
+ *
* @return web root路径
* @since 4.0.13
*/
@@ -3379,16 +3381,16 @@ public class FileUtil {
/**
* 获取指定层级的父路径
- *
+ *
*
* getParent("d:/aaa/bbb/cc/ddd", 0) -> "d:/aaa/bbb/cc/ddd"
* getParent("d:/aaa/bbb/cc/ddd", 2) -> "d:/aaa/bbb"
* getParent("d:/aaa/bbb/cc/ddd", 4) -> "d:/"
* getParent("d:/aaa/bbb/cc/ddd", 5) -> null
*
- *
+ *
* @param filePath 目录或文件路径
- * @param level 层级
+ * @param level 层级
* @return 路径File,如果不存在返回null
* @since 4.1.2
*/
@@ -3403,15 +3405,15 @@ public class FileUtil {
/**
* 获取指定层级的父路径
- *
+ *
*
* getParent(file("d:/aaa/bbb/cc/ddd", 0)) -> "d:/aaa/bbb/cc/ddd"
* getParent(file("d:/aaa/bbb/cc/ddd", 2)) -> "d:/aaa/bbb"
* getParent(file("d:/aaa/bbb/cc/ddd", 4)) -> "d:/"
* getParent(file("d:/aaa/bbb/cc/ddd", 5)) -> null
*
- *
- * @param file 目录或文件
+ *
+ * @param file 目录或文件
* @param level 层级
* @return 路径File,如果不存在返回null
* @since 4.1.2
@@ -3437,9 +3439,9 @@ public class FileUtil {
* 检查父完整路径是否为自路径的前半部分,如果不是说明不是子路径,可能存在slip注入。
*
* 见http://blog.nsfocus.net/zip-slip-2/
- *
+ *
* @param parentFile 父文件或目录
- * @param file 子文件或目录
+ * @param file 子文件或目录
* @return 子文件或目录
* @throws IllegalArgumentException 检查创建的子文件不在父目录中抛出此异常
*/
@@ -3462,7 +3464,7 @@ public class FileUtil {
/**
* 根据文件扩展名获得MimeType
- *
+ *
* @param filePath 文件路径或文件名
* @return MimeType
* @since 4.1.15
@@ -3473,7 +3475,7 @@ public class FileUtil {
/**
* 判断是否为符号链接文件
- *
+ *
* @param file 被检查的文件
* @return 是否为符号链接文件
* @since 4.4.2
@@ -3484,9 +3486,9 @@ public class FileUtil {
/**
* 判断给定的目录是否为给定文件或文件夹的子目录
- *
+ *
* @param parent 父目录
- * @param sub 子目录
+ * @param sub 子目录
* @return 子目录是否为父目录的子目录
* @since 4.5.4
*/
@@ -3498,7 +3500,7 @@ public class FileUtil {
/**
* 创建{@link RandomAccessFile}
- *
+ *
* @param path 文件Path
* @param mode 模式,见{@link FileMode}
* @return {@link RandomAccessFile}
@@ -3510,7 +3512,7 @@ public class FileUtil {
/**
* 创建{@link RandomAccessFile}
- *
+ *
* @param file 文件
* @param mode 模式,见{@link FileMode}
* @return {@link RandomAccessFile}
@@ -3527,8 +3529,8 @@ public class FileUtil {
/**
* 文件内容跟随器,实现类似Linux下"tail -f"命令功能
* 此方法会阻塞当前线程
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param handler 行处理器
*/
public static void tail(File file, LineHandler handler) {
@@ -3538,8 +3540,8 @@ public class FileUtil {
/**
* 文件内容跟随器,实现类似Linux下"tail -f"命令功能
* 此方法会阻塞当前线程
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charset 编码
* @param handler 行处理器
*/
@@ -3550,8 +3552,8 @@ public class FileUtil {
/**
* 文件内容跟随器,实现类似Linux下"tail -f"命令功能
* 此方法会阻塞当前线程
- *
- * @param file 文件
+ *
+ * @param file 文件
* @param charset 编码
*/
public static void tail(File file, Charset charset) {