今天需求方突然来了兴致,要我们统计应用的代码量。
好家伙,靠人数肯定是数不过来,没办法,不如就写一段java代码代劳吧。
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
/**
* Title:代码行数统计工具
* Describe:
* Remark:
* <p>
* Created by Milo
* E-Mail : 303767416@qq.com
* 2024/3/4
*/
public class CodeLinesReadHelper {
public static class ReadObject {
public String projectName;
public String projectDir;
public ReadObject(String projectName, String projectDir) {
this.projectName = projectName;
this.projectDir = projectDir;
}
}
public void startRead(List<ReadObject> readObjects) {
FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getAbsolutePath().contains(".java") || pathname.getAbsolutePath().contains(".kt");
}
};
FileFilter uiFilter = new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getAbsolutePath().contains("VH")
|| pathname.getAbsolutePath().contains("ViewHolder")
|| pathname.getAbsolutePath().contains("Activity")
|| pathname.getAbsolutePath().contains("Fragment")
|| pathname.getAbsolutePath().contains("Dialog");
}
};
int totalLineCount = 0;
int totalUiLineCount = 0;
for (ReadObject readObject : readObjects) {
int projectLineCount = 0;
int uiLineCount = 0;
List<File> allDirList = getAllDirs(readObject.projectDir);
allDirList.add(0, new File(readObject.projectDir));
for (File dirFile : allDirList) {
File[] allFiles = dirFile.listFiles(fileFilter);
if (allFiles != null) {
for (File file : allFiles) {
projectLineCount += getFileLineNum(file.getAbsolutePath());
}
}
File[] uiFiles = dirFile.listFiles(uiFilter);
if (uiFiles != null) {
for (File file : uiFiles) {
uiLineCount += getFileLineNum(file.getAbsolutePath());
}
}
}
System.out.println(String.format("%s 共计行数%s", readObject.projectName, projectLineCount));
totalLineCount += projectLineCount;
totalUiLineCount += uiLineCount;
}
System.out.println("所有ui总行数/项目总行数:" + totalUiLineCount + "/" + totalLineCount + ",ui占比大致为:" + formatDouble(1.0 * totalUiLineCount / totalLineCount));
}
private String formatDouble(double num) {
DecimalFormat format = new DecimalFormat("#0.00");
return format.format(num);
}
private List<File> getAllDirs(String rootDir) {
List<File> list = new LinkedList<>();
File rootFile = new File(rootDir);
File[] fileList = rootFile.listFiles();
if (fileList != null) {
for (File f : fileList) {
if (f.isDirectory()) {
list.add(f);
list.addAll(getAllDirs(f.getAbsolutePath()));
}
}
}
return list;
}
private int getFileLineNum(String filePath) {
try (LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(filePath))) {
lineNumberReader.skip(Long.MAX_VALUE);
int lineNumber = lineNumberReader.getLineNumber();
return lineNumber + 1;//实际上是读取换行符数量 , 所以需要+1
} catch (IOException e) {
return 0;
}
}
}
入口处调用
CodeLinesReadHelper linesReadHelper = new CodeLinesReadHelper();
List<CodeLinesReadHelper.ReadObject> readObjects = new ArrayList<>();
readObjects.add(new CodeLinesReadHelper.ReadObject("工程1", "xxxDir/app/src/main/java"));
readObjects.add(new CodeLinesReadHelper.ReadObject("工程2", "xxxDir/app/src/main/java"));
//fz-libs
linesReadHelper.startRead(readObjects);
大功告成