From 7608e08c2eafcdaf5bb1fd7046b50b2d2d66445a Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 18 Feb 2025 18:03:06 +0800 Subject: [PATCH] =?UTF-8?q?`FileWriter`=E5=A2=9E=E5=8A=A0=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E5=8F=AF=E9=80=89=E6=98=AF=E5=90=A6=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E6=8D=A2=E8=A1=8C=E7=AC=A6=EF=BC=88issue#3858@Github?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../main/java/cn/hutool/core/io/FileUtil.java | 20 ++++++++++++-- .../cn/hutool/core/io/file/FileWriter.java | 27 ++++++++++++++++--- 3 files changed, 42 insertions(+), 6 deletions(-) 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(); }