package com.util;

import java.io.*;
import java.util.regex.Pattern; /**
* 代码统计工具 * 统计某个java源文件或某个目录中所有java源文件中注释、空白行、代码行各占多少行 * 注释:包括单行注释(//)、多行注释、文档注释 * 空白行:一行内没有任何内容的表示空白行 * 代码行:以分号“;”结束的一条语句,可以统计为一行有效代码
*/
public class CodeCounter {
// 记录注释行数
static long annotationLine = 0;
// 记录空白行数
static long blankLine = 0;
// 记录有效代码的行数
static long codeLine = 0;
// 代码总行数
static long totalLine = 0;
// 文件总数
static long fileCount = 0; public static void main(String[] args) throws FileNotFoundException {
File file = new File("/Users/YikaJ/Desktop/test.java");
//根据io读取文件
codeStat(file);
System.out.println("----------统计结果---------");
System.out.println("文件数量:" + fileCount + "个");
System.out.println(file + "文件/目录总行数:" + totalLine);
System.out.println("代码行数:" + codeLine);
System.out.println("注释行数:" + annotationLine);
System.out.println("空白行数:" + blankLine);
long otherLine = totalLine - (codeLine + annotationLine + blankLine);
System.out.println("其它行数:" + otherLine);
} private static void codeStat(File file) throws FileNotFoundException {
if (file == null || !file.exists()) throw new FileNotFoundException(file + ",文件不存在!");
fileCount++; // 文件数累加
if (file.isDirectory()) {
File[] files = file.listFiles(new FileFilter() {
@Override //继承覆盖父类
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java") || pathname.isDirectory();
}
});
//c#的是 foreach(File target in files)
for (File target : files) {
codeStat(target);
}
} else {
BufferedReader bufr;
try {
// 将指定路径的文件与字符流绑定
bufr = new BufferedReader(new FileReader(file));
} catch (FileNotFoundException e) {
throw new RuntimeException(file + ",文件不存在!" + e);
}
// 定义匹配每一行的正则匹配器
// 注释匹配器(匹配单行、多行、文档注释)
Pattern annotationLinePattern = Pattern.compile("((//)|(/\\*+)|((^\\s)*\\*)|((^\\s)*\\*+/))+", Pattern.MULTILINE + Pattern.DOTALL);
// 空白行匹配器(匹配回车、tab键、空格)
Pattern blankLinePattern = Pattern.compile("^\\s*$");
// 代码行匹配器(以分号结束为一行有效语句,包括import和package语句)
Pattern codeLinePattern = Pattern.compile(".+;\\s*(((//)|(/\\*+)).*)*", Pattern.MULTILINE + Pattern.DOTALL);
// 遍历文件中的每一行,并根据正则匹配的结果记录每一行匹配的结果
String line;
try {
while ((line = bufr.readLine()) != null) {
if (annotationLinePattern.matcher(line).find()) {
annotationLine++;
}
if (blankLinePattern.matcher(line).find()) {
blankLine++;
}
if (codeLinePattern.matcher(line).find()) {
codeLine++; }
totalLine++;
}
} catch (IOException e) {
throw new RuntimeException("读取文件失败!" + e);
} finally {
try {
bufr.close();
// 关闭文件输入流并释放系统资源
} catch (IOException e) {
throw new RuntimeException("关闭文件输入流失败!");
}
}
}
}
}

对于,如何通过正则检验字符串中的"//out.print(var)",能力不足,还未实现。

丁又专老师作业——Java检测代码的更多相关文章

  1. java实现 HTTP/HTTPS请求绕过证书检测代码实现

    java实现 HTTP/HTTPS请求绕过证书检测代码实现 1.开发需求 需要实现在服务端发起HTTP/HTTPS请求,访问其他程序资源. 2.URLConnection和HTTPClient的比较 ...

  2. Java第二次作业參考代码

    Java第二次作业參考代码 [程序11] 题目:有1.2.3.4四个数字,能组成多少个互不同样且无反复数字的三位数?都是多少? public class lianxi11 { public stati ...

  3. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  4. 用java具体代码实现分数(即有理数)四则运算

    用java具体代码实现分数(即有理数)四则运算 1,背景 Java老师布置了一个关于有理数运算的题目,因为参考书上有基本代码,所以自己主要是对书上代码做了一点优化,使其用户交互性更加友好以及代码封装性 ...

  5. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  6. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  7. 常用Java静态代码分析工具的分析与比较

    给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...

  8. 1903021121-刘明伟-java十一周作业-java面向对象编程

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第十一周作业 博客名称 1903021121-刘明伟-java十一周作业-java面向对象 要求 每道题要有题目,代码(使用插入代码,不 ...

  9. pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页

    java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...

随机推荐

  1. 成为一个PHP专家:缺失的环节

    这一篇文章是“Becoming a PHP Professional”系列 4 篇博文中的第 1 篇. 当浏览各类与PHP相关的博客时,比如Quora上的问题,谷歌群组,简讯和杂志,我经常注意到技能的 ...

  2. Android应用开发学习笔记之Intent

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Intent是什么呢?来看Android官网上的定义: An intent is an abstractdescri ...

  3. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  4. next_permutation()函数 和 prev_permutation() 按字典序求全排列

    next_permutation功能:    求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm> 与之完全相反的函数还有prev_permutation 这个 ...

  5. LA 4123 (计数 递推) Glenbow Museum

    题意: 这种所有边都是垂直或水平的多边形,可以用一个字符串来表示,一个270°的内角记作O,一个90°的内角记作R. 如果多边形内存在一个点,能看到该多边形所有的点,则这个多边形对应的序列是合法的.这 ...

  6. ubuntu下安装mysql及外网访问设置

    这么多年一直是mssql或者Oracle,mysql基本没用过,借着.net即将跨平台之际,也mysql一把.windows安装基本没啥难度,然后就是试了把linux下...结果坑不少,由于linux ...

  7. 证明:寝室分配问题是NPC问题

    P.NP.NPC.NP-hard P:多项式时间能够解决的问题的集合,比如最短路径问题是集合P的一个元素,而最短路径问题本身又是一个集合,因此P是集合的集合. NP:多项式时间内能够验证的问题的集合. ...

  8. MDEV Primer

    /************************************************************************** * MDEV Primer * 说明: * 本文 ...

  9. 深入理解移动web开发之PPI,Pixel,DevicePixelRatio(转)

    如果你是一个开始接触移动Web开发的前端工程师,那么你或许也遇到了和我曾经遇到的过问题:有太多新的概念需要掌握,太多相似的概念需要区分.没关系,我将用两篇文章的篇幅来解决这些问题.上篇文章关于解释和区 ...

  10. sql给数据库加锁问题

    加锁是在操作数据时进行了,不能事后加锁. 例: begin   tran           insert   表   with(TABLOCKX)     --加锁           (字段列表) ...