Eclipse统计项目代码行数

时间:2022-09-12 23:09:44

在项目中,我们常常有统计代码行数的需要,但是如果不利用第三方工具的话,面对一个项目(甚至一个工程或解决方案中若干个项目)中成百上千的代码文件,实在有一种力不从心的感觉。

我们期望能够用最简单的方法完成这些重要却细微的需求。下面我给大家介绍一种无需借助第三方工具,无需复杂操作,无需人工统计计算的方法解决这个问题。

下面的方法就是所有的IDE都有的“查找”,在查找框中输入内容(选择正则表达式),选择好搜索范围,点击搜索则会显示匹配结果,会看到诸如: 在xxx个文件中查到xxx个匹配项。

一、Search->File

Eclipse统计项目代码行数

1统计代码行数:\n

2统计代码行数并排除空行:^[ \t]*[^ \t\n\r]+.*

上面的方法可以很迅速地得到代码行数,不过遗憾的是统计结果把空行(仅包含空格和制表符的行)也统计进去了,然而很多时候我们并不想把这些文本也给算进代码量里去,怎么办呢?别急,我们只要对正则表达式做一点点修改。我的思路是,只需要找出一个不是空格或制表符的字符即可,于是我写出了这个正则表达式 ^[ \t]*[^ \t\n\r]+.*$ ,它表示先忽略一行前面的连续空格和制表符,然后寻找是否有一个字符不为空格、制表符、换行符和回车符,如果有则表明这行不为空行。

3统计代码行数并排除空行和注释行:^[ \t]*[^ \t\n\r/#]+.*$

在实际项目中,我们或许认为注释行不应成为生产量,应从统计数据中排除出去。似乎这个问题棘手得多。不过别担心,只要善于利用正则表达式,这个问题也能轻松解决。

我们首先要能够对注释行有一个认识。很多程序设计语言中,注释行都会用“/”或者“#”等字符开头。我们假设项目中的注释行都是以“/”或“#”开头的(请读者考虑自己项目的特点自行修改),那么我们要查找的是一行中第一个非空字符不是“/”和“#”的行。跟上一节类似地,我们可以写出^[ \t]*[^ \t\n\r/#]+.*$ 。

二、代码实现

import java.io.BufferedReader;  
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;


public class LineCounter {
List<File> list = new ArrayList<File>();
int linenumber = 0;

FileReader fr = null;
BufferedReader br = null;

public void counter(String path) {
// String path = System.getProperty("user.dir");
System.out.println("项目路径"+path);
File file = new File(path);
File files[] = null;
files = file.listFiles();
addFile(files);
isDirectory(files);
readLinePerFile();
System.out.println("Totle:" + linenumber + "行");
}

// 判断是否是目录
public void isDirectory(File[] files) {
for (File s : files) {
if (s.isDirectory()) {
File file[] = s.listFiles();
addFile(file);
isDirectory(file);
continue;
}
}
}

//将src下所有文件组织成list
public void addFile(File file[]) {
for (int index = 0; index < file.length; index++) {
list.add(file[index]);
// System.out.println(list.size());
}
}

//读取非空白行
public void readLinePerFile() {
try {
for (File s : list) {
int yuan = linenumber;
if (s.isDirectory()) {
continue;
}
if(s.getName().lastIndexOf(".java")>0||s.getName().lastIndexOf(".jsp")>0||s.getName().lastIndexOf(".js")>0||s.getName().lastIndexOf(".css")>0)
{

}else{
continue;
}
fr = new FileReader(s);
br = new BufferedReader(fr);
String i = "";
while ((i = br.readLine()) != null) {
if (isBlankLine(i))
linenumber++;
}
System.out.print(s.getName());
System.out.println("\t\t有" + (linenumber - yuan) + "行");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
}
}
if (fr != null) {
try {
fr.close();
} catch (Exception e) {
}
}
}
}

//是否是空行
public boolean isBlankLine(String i) {
if (i.trim().length() == 0) {
return false;
} else {
return true;
}
}

public static void main(String args[]) {
LineCounter lc = new LineCounter();
lc.counter("W:/workspaces/wm/xxProject"); //$NON-NLS-1$
}
}

参考文献:

1、http://www.cnblogs.com/bitzhuwei/p/how-many-lines-in-project.html

2、http://blog.csdn.net/xiangtianzaijie500/article/details/53096709

3、http://www.cnblogs.com/javawebsoa/archive/2013/05/04/3059993.html