1.简化版: (写死了对.java文件 统计代码行数、文件个数)
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class LinesOfCode {
public static void main(String[] args) {
showLines(new File("D:\\明治"));
System.out.println("Java代码总行数为"+linesnum);
System.out.println("Java文件个数为"+javafnum);
}
/**
* 统计Idea中文件夹文件的 代码行数;
* 统计 java文件个数。
* @param path Idea项目存放地址
*/
//写在外面 便于以下方法递归时 不会重新定义num
private static int linesnum;//java代码函数
private static int javafnum;//java文件个数
public static void showLines(File file){
if(!file.exists()){//不存在此文件 结束此方法
return;
}
//判断是否为 文件
//文件————判断文件的后缀名 是不是java,如果是java进行io操作去统计行数
if(file.isFile()){
if(file.getName().endsWith(".java")){//判断是否为 java文件
javafnum++;
try(
BufferedReader bf = new BufferedReader(new FileReader(file));
) {
while (bf.readLine()!=null){
linesnum++;
}
return;
}catch (IOException e){
e.printStackTrace();
}
}else {
return;//不是.java的文件 不用继续以下文件夹判断
}
}
//判断是否为 文件夹
//文件夹————遍历指定文件夹,
if(file.isDirectory()){
File[] files = file.listFiles();
if(files==null||files.length==0){//为 空文件夹
return;
}
for (File f : files) {
showLines(f);
}
}
}
}
2.优化版:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class UFcount {
static long classcount = 0; // Java类的数量
static long normalLines = 0; // 空行
static long commentLines = 0; // 注释行
static long writeLines = 0; // 代码行
static long allLines = 0; // 代码行
public static void main(String[] args) throws Exception {
File f = new File("D:\\明治"); // 目录
String type = ".java";//查找什么类型的代码,如".java"就是查找以java开发的代码量,".php"就是查找以PHP开发的代码量
UFcount.treeFile(f,type);
System.out.println("路径:" + f.getPath());
System.out.println(type+"类数量:" + classcount);
System.out.println("写代码数量:" + writeLines);
System.out.println("注释数量:" + commentLines);
System.out.println("空行数量:" + normalLines);
if(classcount==0){
System.out.println("代码平均数量:" + 0);
}else{
System.out.println("代码平均数量:" + writeLines / classcount);
}
System.out.println("总 行数量:" + allLines);
}
/**
* 查找出一个目录下所有的.java文件
*
* @throws Exception
*/
public static void treeFile(File f,String type) throws Exception {
File[] childs = f.listFiles();
for (int i = 0; i < childs.length; i++) {
File file = childs[i];
if (!file.isDirectory()) {
if (file.getName().endsWith(type)) {
classcount++;
BufferedReader br = null;
boolean comment = false;
br = new BufferedReader(new FileReader(file));
String line = "";
while ((line = br.readLine()) != null) {
allLines++;
line = line.trim();
if (line.matches("^[//s&&[^//n]]*$")) {//这一行匹配以空格开头,但不是以回车符开头,但以回车符结尾
normalLines++;
} else if (line.startsWith("/*")
&& !line.endsWith("*/")) {//匹配以/*......*/括住的多行注释
commentLines++;
comment = true;
} else if (true == comment) {
commentLines++;
if (line.endsWith("*/")) {
comment = false;
}//匹配以//开头的单行注释,及以/*......*/括住的单行注释
} else if (line.startsWith("//") || (line.startsWith("/*")&&line.endsWith("*/"))) {
commentLines++;
} else {//其他的就是代码行
writeLines++;
}
}
if (br != null) {
br.close();
br = null;
}
}
} else {
treeFile(childs[i],type);
}
}
}
}