大学的时候,由于创新项目要验收,老师需要知道整个项目用了多少行代码,顺便要统计下别的团队的项目情况。遂自己用java写了一个小程序,用来满足这个小需求。
昨天晚上(已毕业),老师突然找到我,说要我把当初的这个程序翻出来,给他用用。
遂找遍了整个硬盘,最后好不容易发现了那串代码,但是从现在的眼神看来,那段代码早已惨不忍睹。刚好今天晚上正好睡不着,优化了下以前是代码。
好多次把
System.out.println()
写成了console.log()
,前端程序员,不解释。
好,这里搬一下代码。其实最核心的地方还是isEffect方法。
代码还是不太完善,比如忽略目录
只能忽略根目录下的一级子目录等等,如果有时间再完善下。这是不是重复造轮子呢。。
package com.hirra;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class ReadFile {
List<String> extensionsArr = new ArrayList<String>();
List<String> ignoreArr = new ArrayList<String>();
int resultCount = 0;
public void setExtensionsArr(List<String> extensionsArr) {
this.extensionsArr = extensionsArr;
}
public void setIgnoreArr(List<String> ignoreArr) {
this.ignoreArr = ignoreArr;
}
public ReadFile() {
}
public int getResult(String filepath) throws Exception {
readfile(filepath);
return this.resultCount;
}
/**
* 遍历文件夹
*
* @param filepath
* 文件路径
* @return 文件的行数
*/
public int readfile(String filepath) throws Exception {
File file = new File(filepath);
if (!file.exists()) {
return 0;
}
String[] filelist = file.list();
for (int i = 0; i < filelist.length; i++) {
File readfile = new File(filepath + "/" + filelist[i]);
if (!readfile.isDirectory()) {
String extension = getFileExtension(readfile);
// 如果后缀名是数组里
if (this.extensionsArr.contains(extension)) {
this.resultCount += getFileCount(readfile.getAbsolutePath());
}
} else if (readfile.isDirectory()) {
String dirName = readfile.getName();
if (!this.ignoreArr.contains(dirName)) {
readfile(filepath + "/" + filelist[i]);
}
}
}
return resultCount;
}
/**
* 获取文件扩展名
*
* @param file
* @return
*/
public String getFileExtension(File file) {
String fileName = file.getName();
if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) {
return fileName.substring(fileName.lastIndexOf(".") + 1);
} else {
return "";
}
}
/**
* 得到文件的有效行数
*
* @param filePath
* 文件路径
* @return
* @throws IOException
*/
public int getFileCount(String filePath) throws IOException {
File f = new File(filePath);
if (!f.exists() || !f.isFile()) {
return 0;
}
int count = 0;
InputStream input = new FileInputStream(f);
BufferedReader b = new BufferedReader(new InputStreamReader(input,"UTF-8"));
String value = b.readLine();
while (value != null) {
value = b.readLine();
if (isEffect(value)) {
count++;
}
}
b.close();
input.close();
return count;
}
/**
* 是否为有效代码
*
* @param line
* @return
*/
public boolean isEffect(String line) {
if (line == null) {
return false;
}
boolean comment = false;
// white line
if (line.matches("[//s]*")) {
return false;
}
// block comments that ends within this line
else if (line.matches("^///*.*") && line.matches(".*//*/$")) {
return false;
}
// block comments that starts in this line but not ends
else if (line.matches("^///*.*") && !line.matches(".*//*/$")) {
comment = true;
return false;
}
// continue block comments
else if (comment) {
// if block comments ends
if (line.matches(".*//*/$") && !line.matches("^///*.*")) {
comment = false;
}
return false;
}
// line comments
else if (line.matches("^//.*")) {
return false;
}
// stand-alone braces
else if (line.equals("{") || line.equals("}")) {
return false;
}
// else, line is effective
return true;
}
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("请输入目录:");
String path = sc.nextLine();
String[] extensionsArr = { "js", "json", "sh" };
String[] ignoreArr = { "node_modules" };
ReadFile rf = new ReadFile();
rf.setExtensionsArr(Arrays.asList(extensionsArr));
rf.setIgnoreArr(Arrays.asList(ignoreArr));
int result = rf.getResult(path);
System.out.println(result + "行");
} catch (Exception ex) {
System.out.println(ex);
ex.printStackTrace();
}
System.out.println("ok");
}
}