From 791e0bb85f52ad2c202286c1f3ccab65e04c4349 Mon Sep 17 00:00:00 2001 From: tjh Date: Tue, 22 Feb 2022 15:33:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=A1=8C=E6=95=B0FileUtil.getTotalLines?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/core/io/FileUtil.java | 42 ++++++++++++------- .../java/cn/hutool/core/io/FileUtilTest.java | 8 ++++ 2 files changed, 35 insertions(+), 15 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 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); + } + }