利用Java代码统计Android项目代码量

2024-03-04  本文已影响0人  晖仔Milo

今天需求方突然来了兴致,要我们统计应用的代码量。
好家伙,靠人数肯定是数不过来,没办法,不如就写一段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);

大功告成

上一篇 下一篇

猜你喜欢

热点阅读