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