通过逐行读取文件统计
适用于本地文件或项目源码的直接分析。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class LineCounter {
public static int countLines(File file) throws Exception {
int lines = 0;
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
while (reader.readLine() != null) {
lines++;
}
}
return lines;
}
public static void main(String[] args) throws Exception {
File codeFile = new File("src/main/java/com/example/MyClass.java");
System.out.println("代码行数:" + countLines(codeFile));
}
}
特点:
- 优点:无需依赖第三方库,适合快速实现。
- 缺点:需自行处理空行、注释行过滤等问题。
使用Apache Commons IO库
通过现成工具类简化统计流程,适合需要批量处理文件的场景。
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.Collection;
public class CommonsLineCounter {
public static void main(String[] args) {
Collection<File> files = FileUtils.listFiles(
new File("src/main/java"),
new String[]{"java"},
true
);
long totalLines = files.stream()
.mapToLong(file -> FileUtils.lineCount(file))
.sum();
System.out.println("总代码行数:" + totalLines);
}
}
特点:
- 优点:代码简洁,支持文件过滤和递归遍历。
- 缺点:需引入
commons-io依赖。
结合JavaParser解析语法结构
适用于需要区分有效代码行与注释的场景。
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import java.io.FileInputStream;
public class SyntaxAwareCounter {
public static void main(String[] args) throws Exception {
CompilationUnit cu = JavaParser.parse(new FileInputStream("src/main/java/com/example/MyClass.java"));
int codeLines = cu.toString().split("n").length;
System.out.println("有效代码行数(含结构):" + codeLines);
}
}
特点:

- 优点:可排除注释(需结合遍历AST树实现)。
- 缺点:统计结果包含语法结构,可能需进一步处理。
通过Maven插件自动化统计
在构建过程中集成代码行统计,适合持续集成场景。
在pom.xml中添加插件:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.example.LineCounter</mainClass>
</configuration>
</plugin>
</plugins>
</build>
特点:
- 优点:与构建流程集成,支持自动化。
- 缺点:需熟悉Maven配置。
注意事项与优化建议
-
过滤空行与注释
可在逐行读取时添加逻辑判断:String line = reader.readLine().trim(); if (!line.isEmpty() && !line.startsWith("//")) { lines++; } -
处理大文件
使用缓冲流(如BufferedReader)避免内存溢出。
-
多线程优化
对大型项目可采用多线程并行统计。
根据需求选择合适方案:
- 快速统计:Apache Commons IO
- 精确分析:JavaParser解析
- 自动化流程:Maven/Gradle插件
引用说明
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/4949.html