给定一个源代码文件,输出该文件的总行数、空行数、注释行数、代码行数

package iotest;  
  
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileReader;  
import java.io.IOException;  
  
public class StaticsCodeingLine {  
  
    private static int whiteLines = 0;  
    private static int commentLines = 0;  
    private static int normalLines = 0;  
    private static int overallLines=0;
    
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        File f = new File("E:\\test\\src\\iotest\\StaticsCodeingLine.java");   
        sumCode(f);  
    }  
      
    private static void sumCode(File file) {   
        BufferedReader br = null;   
        boolean comment = false;   
        try {   
            br = new BufferedReader(new FileReader(file));   
            String line = "";   
            try {   
                while ((line = br.readLine()) != null) {   
                    line = line.trim();   
                    if (line.matches("^[\\s&&[^\\n]]*$")) {   
                        whiteLines++;   
                    } else if (line.startsWith("/*") && !line.endsWith("*/")) {   
                        commentLines++;   
                        comment = true;   
                    } else if (true == comment) {   
                        commentLines++;   
                        if (line.endsWith("*/")) {   
                            comment = false;   
                        }   
                    } else if (line.startsWith("//")) {   
                            commentLines++;   
                    } else {   
                        normalLines++;   
                    } 
                    overallLines=whiteLines+normalLines+commentLines;
                }   
            } catch (IOException e) {   
                    e.printStackTrace();   
            }   
        } catch (FileNotFoundException e) {   
                e.printStackTrace();   
        } finally {   
            if (br != null) {   
                try {   
                    System.out.println("空行数:"+whiteLines);  
                    System.out.println("注释行数:"+commentLines);  
                    System.out.println("代码行数:"+normalLines);  
                    System.out.println("总行数:"+overallLines);
                    br.close();   
                    br = null;   
                } catch (IOException e) {   
                    e.printStackTrace();   
                }   
            }   
        }   
    }  
}  



从命令行输入一个参数(指定目录或文件),输出该目录下指定类型文件(.cs, .java)的个数、每个文件的总行数、空行数、注释行数、代码行数。目标二代码

  
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileFilter;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.Scanner;  
import java.util.regex.Pattern;  
  
/** 
 * 代码统计工具 
 * 统计某个java源文件或某个目录中所有java源文件中注释、空白行、代码行各占多少行 
 * 注释:包括单行注释(//)、多行注释、文档注释 
 * 空白行:一行内没有任何内容的表示空白行 
 * 代码行:以分号“;”结束的一条语句,可以统计为一行有效代码 
 */  
public class CodeStatDemo {  
      
    // 记录注释行数  
    static long annotationLine = 0;  
      
    // 记录空白行数  
    static long blankLine = 0;  
      
    // 记录有效代码的行数  
    static long codeLine = 0;  
      
    // 代码总行数  
    static long totalLine = 0;  
      
    // 文件总数  
    static long fileCount = 0;  
  
    public static void main(String[] args) throws FileNotFoundException  {  
        System.out.println("请输入要统计代码量的java文件或java目录:");  
        Scanner in = new Scanner(System.in);  
        String filePath = in.nextLine();  
          
        File file = new File(filePath);  
        // 根据用户输入的文件名和目录执行代码量统计  
        codeStat(file);  
          
        System.out.println("----------统计结果---------");  
        System.out.println("文件数量:" + fileCount + "个");  
        System.out.println(file + "文件/目录总行数:" + totalLine);  
        System.out.println("代码行数:" + codeLine);  
        System.out.println("注释行数:" + annotationLine);  
        System.out.println("空白行数:" + blankLine);  
        long otherLine = totalLine - (codeLine + annotationLine + blankLine);  
        System.out.println("其它行数:" + otherLine);  
          
    }  
  
    private static void codeStat(File file) throws FileNotFoundException {  
        if (file == null || !file.exists())   
            throw new FileNotFoundException(file + ",文件不存在!");  
          
        fileCount ++;   // 文件数累加  
          
        if (file.isDirectory()) {  
            File[] files = file.listFiles(new FileFilter() {  
                  
                @Override  
                public boolean accept(File pathname) {  
                    return pathname.getName().endsWith(".java") || pathname.isDirectory();  
                }  
            });  
              
            for (File target : files) {  
                codeStat(target);  
            }  
        } else {  
            BufferedReader bufr = null;  
            try {  
                // 将指定路径的文件与字符流绑定  
                bufr = new BufferedReader(new InputStreamReader(new FileInputStream(file)));  
            } catch (FileNotFoundException e) {  
                throw new FileNotFoundException(file + ",文件不存在!" + e);  
            }  
              
            // 定义匹配每一行的正则匹配器  
            Pattern annotationLinePattern = Pattern.compile("((//)|(/\\*+)|((^\\s)*\\*)|((^\\s)*\\*+/))+",   
                    Pattern.MULTILINE + Pattern.DOTALL);    // 注释匹配器(匹配单行、多行、文档注释)  
              
            Pattern blankLinePattern = Pattern.compile("^\\s*$");   // 空白行匹配器(匹配回车、tab键、空格)  
              
            Pattern codeLinePattern = Pattern.compile("(?!import|package).+;\\s*(((//)|(/\\*+)).*)*",  
                    Pattern.MULTILINE + Pattern.DOTALL); // 代码行匹配器(以分号结束为一行有效语句,但不包括import和package语句)  
              
            // 遍历文件中的每一行,并根据正则匹配的结果记录每一行匹配的结果  
            String line = null;  
            try {  
                while((line = bufr.readLine()) != null) {  
                    if (annotationLinePattern.matcher(line).find()) {  
                        annotationLine ++;  
                    }  
                      
                    if (blankLinePattern.matcher(line).find()) {  
                        blankLine ++;  
                    }  
                      
                    if (codeLinePattern.matcher(line).matches()) {  
                        codeLine ++;  
                    }   
                      
                    totalLine ++;  
                }  
                  
            } catch (IOException e) {  
                throw new RuntimeException("读取文件失败!" + e);  
            } finally {  
                try {  
                    bufr.close();   // 关闭文件输入流并释放系统资源  
                } catch (IOException e) {  
                    throw new RuntimeException("关闭文件输入流失败!");  
                }  
            }  
        }  
    }  
}  



代码行统计工具使用说明 代码行统计工具用Java语言实现,可以对C\C++、Java的源代码进行统计,统计结果包括:总行行数注释行数代码行数,统计结果可以以表格的形式显示给用户或另存为文件。 一 执行环境: 操作系统:WindowsNT/2000; 执行环境:JDK1.3。 二 安装: 1)将code.zip解压缩; 3)设置环境变量: 在 开始—〉设置—〉控制面板—〉系统—〉高级—〉环境变量 中设置环境变量: PATH=[code.zip的安装目录]\jre\bin CLASSPATH=[code.zip的安装目录]\class 三 运行: 直接运行(双击)在源程序[code.zip的安装目录]\class目录下的CodeStatistic.bat 批处理文件。 〈注〉:如果程序不能正常运行,有可能是前面系统环境变量PATH、CLASSPATH设置的问题,请检查添加的路径是否正确,确定正确还不能正常运行,请注销当前用户后再启动程序。 四 使用方法: 1. 代码行统计工具开始工作后,点击窗口下方的“添加”按钮会以对话框的形式浏览硬盘目录,现在可以添加要进行统计的C\C++、Java源程序, 2. 选定文件后,会在代码行统计工具主界面的列表框中显示已选定的文件名和路径; 3. 点击“添加”按钮继续添加需统计的文件或点击“删除”按钮删除已选文件; 4. 需统计的文件选定后,点击“统计”按钮开始统计,弹出“代码行统计结果”窗口以表格形式显示统计结果; 5. 在“代码行统计结果” 窗口中可选择将统计结果另存为文件形式; 6. 点击“关闭”按钮关闭“代码行统计结果” 窗口,回到主窗口; 7. 继续其它统计活动或点击“退出”按钮退出代码行统计工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值