前言

某天,产品叫我算下某个项目的代码行数,我一愣,这怎么统计?总不可能一个文件一个文件算吧?后面我找了下,git是可以统计提交到仓库的所有的代码的,不过有个问题,就是假如有些文件我不想算进去怎么办?之后我再查了下,可以只统计指定文件类型的代码的。

Git统计代码行数

在指定项目文件夹里,打开git命令窗口,执行下面的命令(直接复制)

1、统计所有行数

git log --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END {
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

或者

git ls-files | xargs cat | wc -l

上面两个命令只统计行数,没有细分到文件,下面这个命令是会把每个文件都列出来,并统计每个文件的行数。

 git ls-files | xargs wc -l

2、统计指定文件类型的行数

find . "(" -name "*.java" -or -name "*.xml" -or -name "*.yml" -or -name "*.properties" ")" -print | xargs wc -l


这个命令会打印出文件和对应的行数。

3、统计某个用户的代码量

git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END {
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

4、统计某个时间段内的代码量

git log --since=2022-12-06 --until==2022-12-07 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END {
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

--since:起始时间,--until:终止时间

5、统计某个用户某个时间段内的代码量

git log --since =2022-12-06 --until==2022-12-07 --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END {
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

还有其他命令,可以参考下 这篇文章 ,比较全。

Java实现统计代码行数

Git可以统计代码行数,但是如果我不想要空行和注释行也算进去怎么办?我找了下,好像没有命令可以忽略空行或注释行,既然Git不行,那我们就自己用代码实现统计。

要统计总代码量,得遍历这个项目下的全部文件,然后读取文件内容,遍历每一行的内容,如果是空行或者注释行就忽略。

实现

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;public class 统计代码行数 {private static long 空行数 = 0;private static long 注释行数 = 0;private static long 代码行数 = 0;private static long 总行数 = 0;public static void main(String[] args) {// 这里只统计 \src\main 文件夹里的文件,其他文件像 .idea、test 这些文件夹里的就不算进去了循环文件夹("D:\\Java\\workspace\\AssetsJava","\\src\\main\\");System.out.println("空行:" + 空行数);System.out.println("注释行:" + 注释行数);System.out.println("代码行:" + 代码行数);System.out.println("总行:" + 总行数);}private static void 循环文件夹(String 项目路径,String 只统计指定文件夹) {File f = new File(项目路径);if (!f.exists()){System.out.println("项目路径不存在!");return;}File[] childs = f.listFiles(); // 获取这个项目下的文件、文件夹for (int i = 0; i < childs.length; i++) {File child = childs[i];if (!child.isDirectory()) { // 当前文件不是文件夹,就读取if (child.getParent().contains(只统计指定文件夹)){ // java文件、xml文件、配置文件 只统计main文件夹下的if (child.getName().matches(".*\\.java$") || child.getName().endsWith(".yml") ||child.getName().endsWith(".properties") || child.getName().endsWith(".xml")) {long 单个文件代码行数 = 统计代码行数(child);System.out.println(单个文件代码行数+"\t\t"+child.getName());}}else if ("pom.xml".equals(child.getName())){long 单个文件代码行数 = 统计代码行数(child);System.out.println(单个文件代码行数+"\t\t"+child.getName());}}else { // 当前文件是文件夹,继续递归循环文件夹(child.getPath(),只统计指定文件夹);}}}private static long 统计代码行数(File file){long 单个文件代码行数 = 0;BufferedReader br = null;try{br = new BufferedReader(new FileReader(file));String line = "";boolean flag = false; // 用于标记xml多行注释,为true表示当前行在多行注释中,一直到最后一行注释while ((line = br.readLine()) != null){总行数++;String 内容 = line.trim(); // 每一行的内容,去掉空格if (flag){注释行数++;// 当多行注释结尾是 --> 说明多行注释结束,重新标记为false,表示当前不在统计多行注释if (内容.endsWith("-->")) flag = false;}else {if (内容.length() == 0){空行数++;}else if (内容.startsWith("//") || 内容.startsWith("/**") || 内容.startsWith("*") ||内容.startsWith("*/") || 内容.startsWith("/*") || 内容.startsWith("#")){注释行数++;}else if(内容.startsWith("<!--")){注释行数++;// 当前行属于xml的注释,且结尾不是 --> 时,表示是多行注释,设置标记为trueif (!内容.endsWith("-->")) flag = true;}else {代码行数++;单个文件代码行数++;}}}}catch (Exception e){e.printStackTrace();}finally {try {br.close();} catch (IOException e) {e.printStackTrace();}}return 单个文件代码行数;}
}

统计结果



最后的总行数,是和用Git统计的总行数对得上的。

Git统计代码行数;Java实现统计代码行数,忽略空行、注释行相关推荐

  1. html中的保存功能代码怎么写,java保存html代码怎么写

    java保存html代码怎么写 [2021-01-31 03:29:24]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(" ...

  2. java斗地主代码_基于java实现斗地主代码实例解析

    斗地主 规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 4. 查看三人各自手中的牌(按照牌的大小排序).底牌 手中扑克 ...

  3. java大文件首行追加,java中实现,在大文件的第一行添加内容

    需求描述: 最近在写一个定时任务,发送多次请求到接口,接口返回报文写入到一个文件中,文件要求格式第一行为总数.这个总数只能在最后的时候才能知道, 这就相当于提出了一个要求:在文件的第一行添加内容,以前 ...

  4. java游戏倒计时代码怎么用,Java实现倒计时代码

    import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask ...

  5. 代码洁癖系列(四):可忽略的注释

    刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...

  6. Python编程 统计Java源文件代码行数,注释行数,空白行数

    每次学习新的语言,就想重新实现一遍做过的课设=,= 这里实现的是"综合性实验 Java源代码分析程序"的第三部分 第二部分见:[Python编程]统计目录下Java源文件的关键字出 ...

  7. java 统计文本行数_统计文本文件的行数,单词书,字节数

    [java]代码库import java.io.*; /** * 统计文本文件的行数,单词书,字节数 */ class WordCount { public static int words = 1; ...

  8. java个人介绍代码_个人项目WC(Java)

    1.WC项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词 ...

  9. java判断一个文件有多少行_Java关于条件判断练习--统计一个src文件下的所有.java文件内的代码行数(注释行、空白行不统计在内)...

    要求:统计一个src文件下的所有.java文件内的代码行数(注释行.空白行不统计在内) 分析:先封装一个静态方法用于统计确定的.java文件的有效代码行数.使用字符缓冲流读取文件,首先判断是否是块注释 ...

最新文章

  1. 技术流 | 手把手教你用Python设计一个命令行界面
  2. 以计算机为主题的英语作文范例,myfamily英语作文范文示例
  3. vue foreach用法_两年前端er,JS和Vue,面试被问了哪些问题呢?有点简单啊
  4. 看动画学算法之:doublyLinkedList
  5. protected访问权限_复习封装与访问控制
  6. OJ1006: 求等差数列的和
  7. java面试要点---ibatiS框架的使用方法介绍---随时更新
  8. js拼的onclick调用方法需要注意的地方 之二
  9. android+大富翁+局域网,【图片】大富翁6局域网(LAN)多人联机教程(求精)_大富翁吧_百度贴吧...
  10. graphics2d 乱码 java_java Graphics2D绘制文字并居中并解决服务器乱码问题
  11. python画50个图-python绘制多个子图的实例
  12. 微信小程序云开发教程-JavaScript入门(3)-数据类型
  13. java连接oracle sid_jdbc连接数据库使用sid和service_name的区别
  14. 如何用好项目管理工具
  15. 基于matlab的语音信号处理
  16. 合作开发过程产生的专利_合作开发合同和技术联营合同的区别及
  17. 最佳Icon图标库推荐,收藏等于学会
  18. Pivotal任命Lionel Lim为Pivotal公司副总裁兼亚太区常务董事
  19. github在线简历
  20. End-to-end/hand-crafted的含义(深度学习)

热门文章

  1. ztree java 异步_使用 zTree 异步加载
  2. 阿里云IoT物联网平台
  3. Java调用Cplex的基础简单教程
  4. 小米笔记本 - 驱动下载
  5. 蓝桥杯赛前真题 Python组 Day 4
  6. php mysql中文乱码怎么解决_php读取mysql中文乱码怎么解决?
  7. 空调噪音测试软件,空调噪音如何测试 空调噪音测试方法【详细介绍】
  8. 【DL】时间序列的深度学习
  9. linux文件名后 rc 是什么意思
  10. Tomcat的下载、安装和使用(超详细讲解)