diff --git a/CHANGELOG.md b/CHANGELOG.md index ed8eb9a33..1b8dfb09c 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### 🐣新特性 * 【json 】 ObjectMapper删除重复trim(pr#3859@Github) +* 【core 】 `FileWriter`增加方法,可选是否追加换行符(issue#3858@Github) ### 🐞Bug修复 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 11f8f29bd..4ec01aa22 100755 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -561,7 +561,8 @@ public class FileUtil extends PathUtil { /** * 计算文件的总行数
- * 参考:https://stackoverflow.com/questions/453018/number-of-lines-in-a-file-in-java + * 参考:https://stackoverflow.com/questions/453018/number-of-lines-in-a-file-in-java
+ * 最后一行如果末尾带有换行符,则被当作为新行 * * @param file 文件 * @param bufferSize 缓存大小,小于1则使用默认的1024 @@ -569,6 +570,20 @@ public class FileUtil extends PathUtil { * @since 5.8.28 */ public static int getTotalLines(File file, int bufferSize) { + return getTotalLines(file, bufferSize, true); + } + + /** + * 计算文件的总行数
+ * 参考:https://stackoverflow.com/questions/453018/number-of-lines-in-a-file-in-java + * + * @param file 文件 + * @param bufferSize 缓存大小,小于1则使用默认的1024 + * @param lastLineSeparatorAsNewLine 是否将最后一行分隔符作为新行,Linux下要求最后一行必须带有换行符,不算一行,此处用户选择 + * @return 该文件总行数 + * @since 5.8.37 + */ + public static int getTotalLines(File file, int bufferSize, boolean lastLineSeparatorAsNewLine) { if (false == isFile(file)) { throw new IORuntimeException("Input must be a File"); } @@ -615,7 +630,8 @@ public class FileUtil extends PathUtil { } // 最后一个字符为换行符,则单独计数行 - if(c == CharUtil.CR){ + // Linux下最后一行要求必须有换行符,不能单独计算一行,此处交给用户选择 + if(lastLineSeparatorAsNewLine && c == CharUtil.CR){ ++count; } diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java index f07fbd0ad..26445629a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWriter.java @@ -159,7 +159,7 @@ public class FileWriter extends FileWrapper { } /** - * 将列表写入文件,覆盖模式 + * 将列表写入文件,覆盖模式,最后一行末尾不追加换行符 * * @param 集合元素类型 * @param list 列表 @@ -171,7 +171,7 @@ public class FileWriter extends FileWrapper { } /** - * 将列表写入文件,追加模式 + * 将列表写入文件,追加模式,最后一行末尾不追加换行符 * * @param 集合元素类型 * @param list 列表 @@ -183,7 +183,7 @@ public class FileWriter extends FileWrapper { } /** - * 将列表写入文件 + * 将列表写入文件,最后一行末尾不追加换行符 * * @param 集合元素类型 * @param list 列表 @@ -196,7 +196,7 @@ public class FileWriter extends FileWrapper { } /** - * 将列表写入文件 + * 将列表写入文件,最后一行末尾不追加换行符 * * @param 集合元素类型 * @param list 列表 @@ -207,6 +207,22 @@ public class FileWriter extends FileWrapper { * @since 3.1.0 */ public File writeLines(Iterable list, LineSeparator lineSeparator, boolean isAppend) throws IORuntimeException { + return writeLines(list, lineSeparator, isAppend, false); + } + + /** + * 将列表写入文件 + * + * @param 集合元素类型 + * @param list 列表 + * @param lineSeparator 换行符枚举(Windows、Mac或Linux换行符) + * @param isAppend 是否追加 + * @param appendLineSeparator 是否在最后一行末尾追加换行符,Linux下要求最后一行必须带有换行符 + * @return 目标文件 + * @throws IORuntimeException IO异常 + * @since 5.8.37 + */ + public File writeLines(Iterable list, LineSeparator lineSeparator, boolean isAppend, boolean appendLineSeparator) throws IORuntimeException { try (PrintWriter writer = getPrintWriter(isAppend)) { boolean isFirst = true; for (T t : list) { @@ -221,6 +237,9 @@ public class FileWriter extends FileWrapper { printNewLine(writer, lineSeparator); } writer.print(t); + if(appendLineSeparator){ + printNewLine(writer, lineSeparator); + } writer.flush(); }