Java统计项目有效代码行数

大学的时候,由于创新项目要验收,老师需要知道整个项目用了多少行代码,顺便要统计下别的团队的项目情况。遂自己用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");
    }
}