package codecounter;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class CodeCounter {
static long commentLine = 0;
static long whiteLine = 0;
static long normalLine = 0;
static long totalLine = 0;
static boolean comment = false;
static final String base_dir = "D:\\javap\\qdgs\\qdgs_gzfw\\src\\java\\qdgsgzfw"; public static void main(String[] args) {
File file = new File(base_dir); // 在这里输入需要统计的文件夹路径 getChild(file); System.out.println("有效代码行数: " + normalLine);
System.out.println("注释行数: " + commentLine);
System.out.println("空白行数: " + whiteLine);
System.out.println("总代码行数: " + totalLine);
} private static void getChild(File child) { // 遍历子目录
if (child.getName().matches(".*\\.java$")) { // 只查询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()) {
getChild(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 (findPair(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 (findPair(line)) {
comment = false;
} else {
comment = true;
}
} else if (line.matches(".+/\\*.*") && line.endsWith("*/")) {
commentLine++;
normalLine++;
comment = false;
} else {
normalLine++;
}
} private static boolean findPair(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);
} }

最新文章

  1. Shell替换
  2. 关于DOM的一些总结(未完待续......)
  3. 51nod 1005 大数加法
  4. file_put_contents保存数据,
  5. SQL Server认证培训与考试
  6. CentOS6.5菜鸟之旅:U盘安装CentOS64位
  7. 程序退出异常_DebugHeapDelete和std::numpunct
  8. Swift学习(二)
  9. svn 检出 Check out 请求的名称有效,但是找不到请求的类型的数据。
  10. 怎样在WINDOWS下面编译LIBCURL
  11. 【转】VC6.0打开或者添加工程文件崩溃的解决方法
  12. 翻译连载 | 第 9 章:递归(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
  13. docker 学习资料收集
  14. 【CQOI2017】【BZOJ4813】小Q的棋盘 DFS
  15. URL与视图
  16. service redis start
  17. HTTP 错误 404.0 - Not Found
  18. Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to IP1:8020 Invalid volume failure config value: 1
  19. Linux渗透之反弹Shell
  20. R语言:R2OpenBUGS

热门文章

  1. 关于iosApp审核问题
  2. ANDROID DisplayManager 服务解析一
  3. 手机也需“绿色环保”,省电类APP或将成为“标配”?
  4. 大并发下TCP内存消耗优化小记(86万并发业务正常服务)
  5. 部署包含水晶报表Crystal Reports 的VS.NET2005应用程序[原创]
  6. Kubernetes基础:查看状态、管理服务
  7. HotSpot Generations
  8. CSS 强制换行和禁止换行强制换行 和禁止换行样式
  9. XlsToOra
  10. Sutherland-Hodgeman多边形裁剪