From f3c97bdc4ded35c7697cabb0015293733acd3e22 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 18 Feb 2025 18:34:14 +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 --- .../main/java/cn/hutool/core/io/FileUtil.java | 14 ++++++++++---- .../java/cn/hutool/core/io/FileUtilTest.java | 16 +++++++++++++--- 2 files changed, 23 insertions(+), 7 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 4ec01aa22..2c3e9a854 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 @@ -629,10 +629,16 @@ public class FileUtil extends PathUtil { readChars = is.read(chars); } - // 最后一个字符为换行符,则单独计数行 - // Linux下最后一行要求必须有换行符,不能单独计算一行,此处交给用户选择 - if(lastLineSeparatorAsNewLine && c == CharUtil.CR){ - ++count; + if(lastLineSeparatorAsNewLine){ + // 最后一个字符为\r,则单独计数行 + if(c == CharUtil.CR){ + ++count; + } + }else{ + // 最后一个字符为\n,则可选是否算作新行单独计数行 + if(c == CharUtil.LF){ + --count; + } } return count; diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java index bce768e79..0b1de97d1 100644 --- a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.file.LineSeparator; import cn.hutool.core.lang.Console; import cn.hutool.core.util.CharsetUtil; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -538,22 +539,31 @@ public class FileUtilTest { @Test public void getTotalLinesTest() { // 此文件最后一行有换行符,则最后的空行算作一行 - final int totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines.csv")); + int totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines.csv")); assertEquals(8, totalLines); + + totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines.csv"), -1, false); + Assertions.assertEquals(7, totalLines); } @Test public void getTotalLinesCrTest() { // 此文件最后一行有换行符,则最后的空行算作一行 - final int totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines_cr.csv")); + int totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines_cr.csv")); assertEquals(8, totalLines); + + totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines_cr.csv"), -1, false); + Assertions.assertEquals(7, totalLines); } @Test public void getTotalLinesCrlfTest() { // 此文件最后一行有换行符,则最后的空行算作一行 - final int totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines_crlf.csv")); + int totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines_crlf.csv")); assertEquals(8, totalLines); + + totalLines = FileUtil.getTotalLines(FileUtil.file("test_lines_crlf.csv"), -1, false); + Assertions.assertEquals(7, totalLines); } @Test