如果要统计项目的代码量(行数),需要对整个项目的每一个文件进行统计,很是麻烦。另外,如果是想要查找或者替换项目中的某个词语,一个一个文件找,也是一件麻烦的事情,靠猜的又不是很靠谱,很容易漏掉一些。不过话说回来,这都是一些比较简单的事情,应该让程序自己去做,岂不是很方便。
我用java写了一个比较简单的实现,用它来统计了一个文件夹下面所有java、xml、html文件的行数,并查找到了“AboutActivity”这个词所出现的各个位置,总共用了109毫秒。有图为证:
实现的代码很简单,就是遍历这个文件夹下面所有的文本文件即可。实现代码如下:
package www.zzuli.edu.cn;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 项目代码统计,包含统计代码总行数功能,和查找特定字符串的位置的功能
* <br/><br/>
* 注意:查找中文的时候,必须保证目标项目与此次项目编码格式一致
*
* @author Li Shaoqing
*
*/
public class LineCounter {
/**
* 项目的目录
*/
String projectName = "D:/bussiness/kypg2";
/**
* 要统计的文件类型
*/
String str[] = new String[]{"java", "xml", "html"};
/**
* 要查找的文字
*/
String find = "AboutActivity";
List<File> list = new ArrayList<File>();
int linenumber = 0;
FileReader fr = null;
BufferedReader br = null;
public static void main(String args[]) {
new LineCounter().counter();
}
public void counter() {
Date date = new Date();
File file = new File(projectName);
File files[] = null;
files = file.listFiles();
addFile(files);
readLinePerFile();
System.out.println("总行数:" + linenumber + "行");
System.out.println("统计用时:" + (new Date().getTime() - date.getTime()) + "毫秒");
System.out.println("文件数量:" + list.size() + "个");
}
// 将所有符合查找类型的文件都加入到文件列表中
public void addFile(File file[]) {
for (int index = 0; index < file.length; index++) {
if(file[index].isFile()){
String name = file[index].getName().substring(file[index].getName().lastIndexOf(".") + 1);
for(int i = 0; i < str.length; i++){
if(name.equals(str[i])){
list.add(file[index]);
break;
}
}
} else {
addFile(file[index].listFiles());
}
}
}
// 统计文件
public void readLinePerFile() {
try {
for (File s : list) {
int num = 0;
if (s.isDirectory()) {
continue;
}
fr = new FileReader(s);
br = new BufferedReader(fr);
String i = "";
boolean flag = true;
while ((i = br.readLine()) != null) {
num++;
if(find != null && !find.equals("") && i.indexOf(find) != -1){
if(flag){
System.out.println("文件:" + s.getAbsolutePath());
flag = false;
}
System.err.println("查找结果:" + num + "行," + (i.indexOf(find) + 1) + "列");
}
}
if(!flag){
System.out.println();
}
if(find == null || find.equals("")){
System.out.println("文件:" + s.getAbsolutePath());
System.out.println("总行数:" + num + "\n");
}
linenumber += num;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
}
}
if (fr != null) {
try {
fr.close();
} catch (Exception e) {
}
}
}
}
}
其实写这个东西并不是很难,也不是很麻烦,关键是要有这种思想:让程序去做这种比较简单而又麻烦的事情。这才能体现出一个程序员的优势,没有这种思想的话,不能被称作程序员,只是码农而已。