import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class GetSourceCodeSumLine {
    /**
     * @param args
     */
    public static void main(String[] args) {
// 方法1
        String JavaSourceCodeDir[] = { "E:\\...\\src", "G:\\...\\src" };
        long codeCountLine = getJavaSourceCodeCountLine(JavaSourceCodeDir);

// 方法2
//        ArrayList<String> JavaSourceCodeDirs = new ArrayList<String>();
//        JavaSourceCodeDirs.add("G:\\workspace\\...\\src");
//        JavaSourceCodeDirs.add("G:\\workspace\\...\\src");
//        long codeCountLine = getJavaSourceCodeCountLine(JavaSourceCodeDirs);

        System.out.println(JavaSourceCodeDir.toString() + ":共有 "
                + codeCountLine + " 行java源代码");
    }
    
    
    public static long getJavaSourceCodeCountLine(String[] JavaSourceCodeDirs) {
        long codeCountLine = 0;
        for (String dirPath : JavaSourceCodeDirs) {
            File fl = new File(dirPath);
            if (fl.exists()) {
                codeCountLine += getJavaFileCountLine(fl);
            }
        }
        return codeCountLine;
    }
    
    public static long getJavaSourceCodeCountLine(ArrayList<String> JavaSourceCodeDirs) {
        long codeCountLine = 0;
        for (String dirPath : JavaSourceCodeDirs) {
            File fl = new File(dirPath);
            if (fl.exists()) {
                codeCountLine += getJavaFileCountLine(fl);
            }
        }
        return codeCountLine;
    }

    private static long getJavaFileCountLine(File fl) {
        long javaCodeCountLine = 0;

        if (fl != null && fl.exists()) {
            if (fl.isDirectory()) {
                File[] listFiles = fl.listFiles();
                for (File file : listFiles) {
                    javaCodeCountLine += getJavaFileCountLine(file);
                }
            } else if (fl.isFile() && !fl.isHidden()) {

      // 过滤源码的后缀坠
                if (fl.getName().endsWith(".java")) {

                    FileReader fr = null;
                    BufferedReader br = null;
                    try {
                        fr = new FileReader(fl);
                        br = new BufferedReader(fr);
                        while (br.readLine() != null)
                            javaCodeCountLine++;
                        br.close();
                        fr.close();
                    } catch (Exception e) {
                    } finally {
                        if (fr != null) {
                            try {
                                fr.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            } finally {
                                fr = null;
                            }
                        }
                        if (br != null) {
                            try {
                                br.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            } finally {
                                br = null;
                            }
                        }
                    }
                }

            }
        }
        return javaCodeCountLine;
    }
}

java 计算源码的行数的更多相关文章

  1. 【转】Java HashMap 源码解析(好文章)

    ­ .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...

  2. java集合源码分析(三):ArrayList

    概述 在前文:java集合源码分析(二):List与AbstractList 和 java集合源码分析(一):Collection 与 AbstractCollection 中,我们大致了解了从 Co ...

  3. java集合源码分析(六):HashMap

    概述 HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类.由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,H ...

  4. Java集合源码分析(四)Vector<E>

    Vector<E>简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是 ...

  5. Java集合源码分析(二)ArrayList

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

  6. 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码

    转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...

  7. 自学Java HashMap源码

    自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...

  8. Java集合类源码解析:Vector

    [学习笔记]转载 Java集合类源码解析:Vector   引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector.为什么说是它兄弟呢?因为从容器的构造来说,Vec ...

  9. java HashMap源码分析(JDK8)

    这两天在复习JAVA的知识点,想更深层次的了解一下JAVA,所以就看了看JAVA的源码,把自己的分析写在这里,也当做是笔记吧,方便记忆.写的不对的地方也请大家多多指教. JDK1.6中HashMap采 ...

随机推荐

  1. libusb 开发者指南-牛胜超(转)

    源:libusb 开发者指南 libusb Developers Guidelibusb 开发者指南 原作者:Johannes Erdfelt翻译者:牛胜超 Table of Contents目录 P ...

  2. Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- coding:gbk -*- '''示 ...

  3. UITableView 之 取消选中

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [table ...

  4. Android中关闭应用的三种方式

    当应用不再使用的时候,通常需要关闭应用,我们可以使用三种方式关闭android应用: 第一种方式:首先获取当前进程的id,然后杀死该进程(推荐) android.os.Process.killProc ...

  5. Windows7启用超级管理员administrator账户的多种方法

    开启win7家庭普通版的超级管理员账户Administrotor WIN7家庭普通版没有"本地用户和组"项,不能通过"用计算机右键-管理"的方法开启超级管理员帐 ...

  6. Linux文件权限与目录配置

    一.linux文件属性 用户组概念:假如主机有两个团体,第一个团体名为projecta,里面有class1,class2,class3:第二个团体名为projecb,里面有class4,class5, ...

  7. Java线程:线程交互

    一.基础知识 java.lang.Object的类的三个方法: void notify():唤醒在此对象监视器上等待的单个线程. void notifyAll():唤醒在此对象监视器上等待的所有线程. ...

  8. Spring mvc基本原理

    http://blog.csdn.net/xtu_xiaoxin/article/details/8796499 http://www.cnblogs.com/wawlian/archive/2012 ...

  9. lo dash api

    https://lodash.com/docs 用 Lo-Dash 替换 underscore http://segmentfault.com/a/1190000000359484

  10. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...