您的位置:首页 > 编程语言 > Java开发

输出该目录下指定类型文件(.cs, .java)的个数、文件的总行数、空行数、注释行数、代码行数

2015-04-05 09:57 671 查看
/**
* 网上寻找的例子并修改,加以个人注释,
* 取得当前项目中所有java文件总行数,代码行数,注释行数,空白行数
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//***import块实现了字符串的输入***

public class Code {

@SuppressWarnings("unused")
private static final String PROJECT_DIR = "D:\\eclipse";  /**此句有待探讨*/
//声明文件路径
private static int totle = 0;       //总行数
private static int source  = 0;     //代码行数
private static int blank  = 0;      //空白行数
private static int comments = 0;    //注释行数
//private 块实现的是声明了totle;source;blank;comments;这些私有静态的对象
/**
* 读取文件夹内java文件
*
*/
private static void listNext(File dir) {
//一个静态方法
File[] files = dir.listFiles();
//file 对象定义了文件夹内寻找,作用就是从当前所有文件和文件夹中过滤出所有文件夹
for (int i = 0; i < files.length; i++) {
//判断是否是文件夹,如果是文件夹继续向下检索
if (files[i].isDirectory()) {
listNext(files[i]);
} else {
try {
if (files[i].getName().endsWith(".java")) {
System.out.println(files[i].getAbsolutePath());
javaLine(files[i]);
}
}catch (Exception e) { //捕获异常
e.printStackTrace();
}
}
}
}

/**
* 读取java文件总行数,代码行数,空白行数,注释行数
*/
private static void javaLine(File f) throws FileNotFoundException, IOException{
//通过调用一个之前定义的对象来表示此文件连接,file参数表示的路径作为参数调用javaLine方法
String strLine = "";//创建了一个对象。并且加入字符串池中
String str = fromFile(f);
//str为引用  "" 是 引用指向的的值,定义一个String 类型的变量str,并为其赋值
if (str.length() > 0) {
while (str.indexOf('\n') != -1) {
//通过一个wile循环体判断这个值,从而做到字符串处理,使得字符串以正确方式显示
totle++;

strLine = str.substring(0, str.indexOf('\n')).trim();

if (strLine.length() == 0 ) {
blank++;
}else if (strLine.charAt(0) == '*' || strLine.charAt(0) == '/') {
comments++;
}else{
source++;
String regEx = "^*//";
if(regEx(strLine,regEx)){
comments++;
}
}
str = str.substring(str.indexOf('\n') + 1, str.length());
//返回给定区间的字符串,以上经过转换后,str能够正常显示
}
}
}

/**
* 将java文件以字符数组形式读取
*/
private static String  fromFile(File f) throws FileNotFoundException,IOException {
FileInputStream fis = new FileInputStream(f);
//  FileInputStream类的重载,读取当前目录下的java文件
byte[] b = new byte[(int) f.length()];
//用f的长度初始化一个byte型数组;对返回的长度值做强制类型转换,转换成int型
fis.read(b);
fis.close();
return new String(b);//就是返回一个b的实例
}

/**
* 输入字符串
* 正则匹配字符串
*/
private static boolean regEx(String str,String regEx){
//如果包含正则表达式,则定义特殊的字符,regex匹配的字符串
Pattern p=Pattern.compile(regEx);//pattern类的实例表示以字符形式指定的正则表达式,此处是一个编译成某种模式
Matcher m=p.matcher(str);//创建一个匹配器
boolean result=m.find();
return result;
}
public static void main(String[] args) throws FileNotFoundException, IOException {
File directory = new File("");//参数为空
//获取项目路径
String projectFile = directory.getCanonicalPath() ;
System.out.println(projectFile+"********");
listNext(new File(projectFile));
System.out.println("文件总行数:"+totle+1);
System.out.println("代码行数:"+source);
System.out.println("空白行数:"+blank);
System.out.println("注释行数:"+comments);
}
}
/**
* 程序经过修改调整能够运行了,不过自己还是还有很大的疑问没解决,这个程序我自己不是很理解
* 因为程序是怎么样的获取当前路径的?就仅仅是获取当前的java工程包里的所有文件的吗?那我想具体到哪个程序时
* 我不知道怎么修改,尝试多次未能成功;所以在这句时(private static final String PROJECT_DIR = "aa";),我一直
* 认为是一个路径(因为之前的都是要一个具体的路径才行的,因此有思维上的导误);当要具体到哪个程序时,该怎么做,而不是
* 是所有java包内的文件;以前都没有做过具体的去注解程序的;
* 都是自己看着觉得是这样的意思,就认为是了,最多再去网上查下,但是这次是做作业,所以就认真了好多,即使自己觉得是这个意思了
* 还是会到网上去查找一下,尽量做到注解没错,而不是自己的认为的意思
* 这次的作业让自己感触挺多的。。遗憾没能做到输出具体文件的代码行数,仅仅一个总数...........
*/

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐