基于java开发的查询你编写了多少代码的小程序
开发工具:eclipse
开发环境:jdk1.8
导入的包
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
代码统计工具
/**
* 代码统计工具
*
* @author Freedom
*/
public class CodesStatistics {
private List<String> javaFiles;
private Pattern patternLines;
private Pattern patternWhiteSpaceLines;
private Pattern patternCommentLines;
{
// 匹配行表达式
patternLines = Pattern.compile("\\n");
// 匹配空白行表达式
patternWhiteSpaceLines = Pattern.compile("\\n[\\s| ]*\\n");
// 匹配注释表达式
patternCommentLines = Pattern.compile("(//)|(/\\*)|(\\*)");
}
public CodesStatistics(File baseDir) {
// 容器初始化
javaFiles = new ArrayList<String>();
// 读取Java文件到集合
readJavaFilesToList(baseDir);
// 文件总数
System.out.println("java文件总数:" + javaFiles.size() + "个");
}
读取所有Java文件到集合中
/**
* 读取所有Java文件到集合中
* @param dir
*/
public void readJavaFilesToList(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
File f = files[i];
if (f.isFile() && isJavaFile(f)) {
// 将文件绝对路径添加到集合
javaFiles.add(f.getAbsolutePath());
} else {
// 对目录递归
readJavaFilesToList(f);
}
}
}
}
判断指定文件是否是Java文件
/**
* 判断指定文件是否是Java文件
* @param f
* @return
*/
public boolean isJavaFile(File f) {
return f.getName().toLowerCase().endsWith(".java");
}
匹配所有代码行
/**
* 匹配所有代码行
* @return
*/
public int countLines() {
int count = 0;
for (int i = 0; i < javaFiles.size(); i++) {
String content = FileUtils.readToString(javaFiles.get(i));
Matcher matcher = patternLines.matcher(content);
while (matcher.find()) {
count++;
}
}
return count;
}
匹配空白代码行
/**
* 匹配空白代码行
* @return
*/
public int countWhiteSpaceLines() {
int count = 0;
for (int i = 0; i < javaFiles.size(); i++) {
String content = FileUtils.readToString(javaFiles.get(i));
Matcher matcher = patternWhiteSpaceLines.matcher(content);
while (matcher.find()) {
count++;
}
}
return count;
}
匹配注释代码行
/**
* 匹配注释代码行
* @return
*/
public int countCommentLines() {
int count = 0;
for (int i = 0; i < javaFiles.size(); i++) {
String content = FileUtils.readToString(javaFiles.get(i));
Matcher matcher = patternCommentLines.matcher(content);
while (matcher.find()) {
count++;
}
}
return count;
}
匹配有效代码行
/**
* 有效代码行
*
* @return
*/
public int countValidLines() {
return countLines() - countWhiteSpaceLines() - countCommentLines();
}
创建读取代码的绝对路径来获取代码的内容的类
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class FileUtils {
/**
* 根据提供的文件路径,读取文件中的文本并返回
* @param filePath
* @return
*/
public static String readToString(String filePath){
BufferedReader br = null;
try {
FileInputStream fis = new FileInputStream(filePath);
br = new BufferedReader(new InputStreamReader(fis));
String str = null;
StringBuffer buff = new StringBuffer("");
while((str = br.readLine()) != null) {
buff.append(str).append("\n");
}
return buff.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
使用main方法运行代码
public static void main(String[] args) {
//XXXXX的部分插入你源代码地址即可
File dir = new File("XXXXXXXXXXXXX");
CodesStatistics cs = new CodesStatistics(dir);
int lines1 = cs.countLines();
System.out.println("总代码行数:" + lines1);
int lines2 = cs.countWhiteSpaceLines();
System.out.println("空白代码行数:" + lines2);
int lines3 = cs.countCommentLines();
System.out.println("注释代码行数:" + lines3);
int lines4 = cs.countValidLines();
System.out.println("有效代码行:" + lines4);
}
运行截图