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 d2fa2a9cc..bb08dfe50 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -22,21 +22,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.core.util.ZipUtil; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.RandomAccessFile; -import java.io.Reader; +import java.io.*; import java.net.URI; import java.net.URL; import java.net.URLConnection; @@ -567,6 +553,32 @@ public class FileUtil extends PathUtil { } } + /** + * 计算文件的总行数 + * + * @param file 文件 + * @return 该文件总行数 + */ + public static int getTotalLines(File file) { + if (!isFile(file)) { + throw new IORuntimeException("input must be file"); + } + + try ( + final BufferedReader reader = getReader(file, CharsetUtil.CHARSET_UTF_8); + final LineNumberReader lineNumberReader = new LineNumberReader(reader) + ) { + // 设置起始为1 + lineNumberReader.setLineNumber(1); + // 跳过文件中内容 + lineNumberReader.skip(Long.MAX_VALUE); + // 获取当前行号 + return lineNumberReader.getLineNumber(); + } catch (IOException e) { + throw new IORuntimeException(e); + } + } + /** * 给定文件或目录的最后修改时间是否晚于给定时间 * 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 d33cbb29f..d70490e8b 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 @@ -466,4 +466,12 @@ public class FileUtilTest { Assert.assertTrue(FileUtil.getPrefix(prefixDirTempFile).startsWith("prefix")); } + @Test + @Ignore + public void getTotalLinesTest() { + // 千万行秒级内返回 + final int totalLines = FileUtil.getTotalLines(FileUtil.file("")); + Assert.assertEquals(10000000, totalLines); + } + }