From 04830bf06b8ecf9e7d8492367d38beae17000405 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 19 Sep 2019 10:15:04 +0800 Subject: [PATCH] fix code --- .../main/java/cn/hutool/core/io/FileUtil.java | 1032 +++++++++-------- 1 file changed, 517 insertions(+), 515 deletions(-) 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 f35f42c3a..c55dfb9f8 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 @@ -32,14 +32,7 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.text.DecimalFormat; -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.Set; +import java.util.*; import java.util.jar.JarFile; import java.util.regex.Pattern; import java.util.zip.CRC32; @@ -66,31 +59,44 @@ import cn.hutool.core.util.ZipUtil; /** * 文件工具类 - * - * @author xiaoleilu * + * @author xiaoleilu */ public class FileUtil { - /** 类Unix路径分隔符 */ + /** + * 类Unix路径分隔符 + */ private static final char UNIX_SEPARATOR = CharUtil.SLASH; - /** Windows路径分隔符 */ + /** + * Windows路径分隔符 + */ private static final char WINDOWS_SEPARATOR = CharUtil.BACKSLASH; - /** Windows下文件名中的无效字符 */ + /** + * Windows下文件名中的无效字符 + */ private static Pattern FILE_NAME_INVALID_PATTERN_WIN = Pattern.compile("[\\\\/:*?\"<>|]"); - /** Class文件扩展名 */ + /** + * Class文件扩展名 + */ public static final String CLASS_EXT = ".class"; - /** Jar文件扩展名 */ + /** + * Jar文件扩展名 + */ public static final String JAR_FILE_EXT = ".jar"; - /** 在Jar中的路径jar的扩展名形式 */ + /** + * 在Jar中的路径jar的扩展名形式 + */ public static final String JAR_PATH_EXT = ".jar!"; - /** 当Path为文件形式时, path会加入一个表示文件的前缀 */ + /** + * 当Path为文件形式时, path会加入一个表示文件的前缀 + */ public static final String PATH_FILE_PRE = URLUtil.FILE_URL_PREFIX; /** * 是否为Windows环境 - * + * * @return 是否为Windows环境 * @since 3.0.9 */ @@ -101,7 +107,7 @@ public class FileUtil { /** * 列出目录文件
* 给定的绝对路径不能是压缩包中的路径 - * + * * @param path 目录绝对路径或者相对路径 * @return 文件列表(包含目录) */ @@ -120,7 +126,7 @@ public class FileUtil { /** * 文件是否为空
* 目录:里面没有文件时为空 文件:文件大小为0时为空 - * + * * @param file 文件 * @return 是否为空,当提供非目录时,返回false */ @@ -131,9 +137,7 @@ public class FileUtil { if (file.isDirectory()) { String[] subFiles = file.list(); - if (ArrayUtil.isEmpty(subFiles)) { - return true; - } + return ArrayUtil.isEmpty(subFiles); } else if (file.isFile()) { return file.length() <= 0; } @@ -143,7 +147,7 @@ public class FileUtil { /** * 目录是否为空 - * + * * @param file 目录 * @return 是否为空,当提供非目录时,返回false */ @@ -153,10 +157,10 @@ public class FileUtil { /** * 目录是否为空 - * + * * @param dirPath 目录 * @return 是否为空 - * @exception IORuntimeException IOException + * @throws IORuntimeException IOException */ public static boolean isDirEmpty(Path dirPath) { try (DirectoryStream dirStream = Files.newDirectoryStream(dirPath)) { @@ -168,7 +172,7 @@ public class FileUtil { /** * 目录是否为空 - * + * * @param dir 目录 * @return 是否为空 */ @@ -179,8 +183,8 @@ public class FileUtil { /** * 递归遍历目录以及子目录中的所有文件
* 如果提供file为文件,直接返回过滤结果 - * - * @param path 当前遍历文件或目录的路径 + * + * @param path 当前遍历文件或目录的路径 * @param fileFilter 文件过滤规则对象,选择要保留的文件,只对文件有效,不过滤目录 * @return 文件列表 * @since 3.2.0 @@ -192,13 +196,13 @@ public class FileUtil { /** * 递归遍历目录以及子目录中的所有文件
* 如果提供file为文件,直接返回过滤结果 - * - * @param file 当前遍历文件或目录 + * + * @param file 当前遍历文件或目录 * @param fileFilter 文件过滤规则对象,选择要保留的文件,只对文件有效,不过滤目录 * @return 文件列表 */ public static List loopFiles(File file, FileFilter fileFilter) { - final List fileList = new ArrayList(); + final List fileList = new ArrayList<>(); if (null == file || false == file.exists()) { return fileList; } @@ -222,9 +226,9 @@ public class FileUtil { /** * 递归遍历目录以及子目录中的所有文件
* 如果提供file为文件,直接返回过滤结果 - * - * @param file 当前遍历文件或目录 - * @param maxDepth 遍历最大深度,-1表示遍历到没有目录为止 + * + * @param file 当前遍历文件或目录 + * @param maxDepth 遍历最大深度,-1表示遍历到没有目录为止 * @param fileFilter 文件过滤规则对象,选择要保留的文件,只对文件有效,不过滤目录,null表示接收全部文件 * @return 文件列表 * @since 4.6.3 @@ -243,7 +247,7 @@ public class FileUtil { walkFiles(file.toPath(), maxDepth, new SimpleFileVisitor() { @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 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) {