import java.io.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created with IntelliJ IDEA. * User: 焦一平 * Date: 2015/6/3 * Time: 15:56 * To change this template use File | Settings | File Templates. */ public class CountLineNumber { static long commentLine = 0; static long whiteLine = 0; static long normalLine = 0; static long totalLine = 0; static boolean comment = false; public static void main(String[] args) { File file = new File("D:\\工作\\PDS\\trunk\\sourcecode\\service\\pns"); // 在这里输入需要统计的文件夹路径 countLine(file); System.out.println("有效代码行数: " + normalLine); System.out.println("注释行数: " + commentLine); System.out.println("空白行数: " + whiteLine); System.out.println("总代码行数: " + totalLine); } /** * 递归统计代码行数 * * @param child */ private static void countLine(File child) { // 遍历子目录 if (child.getName().matches(".*\\.java$") || child.getName().matches(".*\\.xml$") || child.getName().matches(".*\\.properties") || child.getName().matches(".*\\.json")) { // 只查询java文件 try { BufferedReader br = new BufferedReader(new FileReader(child)); String line = ""; while ((line = br.readLine()) != null) { parse(line); } } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } if (child.listFiles() != null) { for (File f : child.listFiles()) { countLine(f); } } } private static void parse(String line) { line = line.trim(); totalLine++; if (line.length() == 0) { whiteLine++; } else if (comment) { commentLine++; if (line.endsWith("*/")) { comment = false; } else if (line.matches(".*\\*/.+")) { normalLine++; comment = false; } } else if (line.startsWith("//")) { commentLine++; } else if (line.matches(".+//.*")) { commentLine++; normalLine++; } else if (line.startsWith("/*") && line.matches(".+\\*/.+")) { commentLine++; normalLine++; if (isComment(line)) { comment = false; } else { comment = true; } } else if (line.startsWith("/*") && !line.endsWith("*/")) { commentLine++; comment = true; } else if (line.startsWith("/*") && line.endsWith("*/")) { commentLine++; comment = false; } else if (line.matches(".+/\\*.*") && !line.endsWith("*/")) { commentLine++; normalLine++; if (isComment(line)) { comment = false; } else { comment = true; } } else if (line.matches(".+/\\*.*") && line.endsWith("*/")) { commentLine++; normalLine++; comment = false; } else { normalLine++; } } private static boolean isComment(String line) { // 查找一行中/*与*/是否成对出现 int count1 = 0; int count2 = 0; Pattern p = Pattern.compile("/\\*"); Matcher m = p.matcher(line); while (m.find()) { count1++; } p = Pattern.compile("\\*/"); m = p.matcher(line); while (m.find()) { count2++; } return (count1 == count2); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现