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();
}