package com.zzh.day2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class demo5CodeCounter {
private static int blankline = 0;
private static int remarkline = 0;
private static int normalline = 0;
public static void main(String[] args) {
// Pattern pblankline = Pattern.compile("^[\\s&&[^\\n]]*\\n$");
// Pattern premarkline = Pattern.compile("^[(/\\*)(//)]*\\*/$");
File file = new File("E:\\Java\\RrgExp\\src\\com\\zzh");
tral(file);
System.out.println("空白行是:"+blankline);
System.out.println("注释行是:"+remarkline);
System.out.println("普通行是:"+normalline);
}
private static void tral(File file) {
// TODO Auto-generated method stub
File[] files = file.listFiles();
for(File f : files){
if (f.isDirectory()) {
tral(f);
}else if (f.isFile()) {
if(f.getName().endsWith(".java")){
CodeCounter(f);
}
}
}
}
private static void CodeCounter(File f) {
// TODO Auto-generated method stub
// Matcher mblankline = null;
// Matcher mremarkline = null;
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(f);
br = new BufferedReader(fr);
String string = "";
try {
boolean flag_com = false;
while((string = br.readLine()) != null){
// mblankline = p1.matcher(string);
// mremarkline = p2.matcher(string);
if (string.matches("^\\s*$")) {
//System.out.println(string);
blankline++;
}else if (string.trim().startsWith("/*") && !string.endsWith("*/")) {
//System.out.println(string);
remarkline++;
flag_com = true;
}else if (flag_com) {
//System.out.println(string);
remarkline++;
if(string.endsWith("*/")){
flag_com = false;
}
}else if (string.trim().startsWith("//")) {
//System.out.println(string);
remarkline++;
}else {
normalline ++;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
fr.close();
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
输出结果:
空白行是:53
注释行是:105
普通行是:316
递归遍历某文件夹下面的所有文件,遇见以.java结尾的文件就读取文件中的东西。
匹配空行 ^\s*$ 以空白字符开头并且以空白字符结尾,中间若干个空白字符,这个应该是不严谨,路过的大佬动动小手,留下严谨的正则表达式。
else if (string.trim().startsWith("/*") && !string.endsWith("*/")) {
//System.out.println(string);
remarkline++;
flag_com = true;
}else if (flag_com) {
//System.out.println(string);
remarkline++;
if(string.endsWith("*/")){
flag_com = false;
}
}
注意:在此处判断/*的时候,/*并不一定是第一个字符,其前面可能有若干个空白字符,所有使用trim()去掉。