zoukankan      html  css  js  c++  java
  • 丁又专老师作业——Java检测代码

    package com.util;
    
    import java.io.*;
    import java.util.regex.Pattern;
    
    /**
     * 代码统计工具 * 统计某个java源文件或某个目录中所有java源文件中注释、空白行、代码行各占多少行 * 注释:包括单行注释(//)、多行注释、文档注释 * 空白行:一行内没有任何内容的表示空白行 * 代码行:以分号“;”结束的一条语句,可以统计为一行有效代码
     */
    public class CodeCounter {
        // 记录注释行数
        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 {
            File file = new File("/Users/YikaJ/Desktop/test.java");
            //根据io读取文件
            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();
                    }
                });
                //c#的是  foreach(File target in files)
                for (File target : files) {
                    codeStat(target);
                }
            } else {
                BufferedReader bufr;
                try {
                // 将指定路径的文件与字符流绑定
                    bufr = new BufferedReader(new FileReader(file));
                } catch (FileNotFoundException e) {
                    throw new RuntimeException(file + ",文件不存在!" + e);
                }
                // 定义匹配每一行的正则匹配器
                // 注释匹配器(匹配单行、多行、文档注释)
                Pattern annotationLinePattern = Pattern.compile("((//)|(/\*+)|((^\s)*\*)|((^\s)*\*+/))+", Pattern.MULTILINE + Pattern.DOTALL);
                // 空白行匹配器(匹配回车、tab键、空格)
                Pattern blankLinePattern = Pattern.compile("^\s*$");
                // 代码行匹配器(以分号结束为一行有效语句,包括import和package语句)
                Pattern codeLinePattern = Pattern.compile(".+;\s*(((//)|(/\*+)).*)*", Pattern.MULTILINE + Pattern.DOTALL);
                // 遍历文件中的每一行,并根据正则匹配的结果记录每一行匹配的结果
                String line;
                try {
                    while ((line = bufr.readLine()) != null) {
                        if (annotationLinePattern.matcher(line).find()) {
                            annotationLine++;
                        }
                        if (blankLinePattern.matcher(line).find()) {
                            blankLine++;
                        }
                        if (codeLinePattern.matcher(line).find()) {
                            codeLine++;
    
                        }
                        totalLine++;
                    }
                } catch (IOException e) {
                    throw new RuntimeException("读取文件失败!" + e);
                } finally {
                    try {
                        bufr.close();
                        // 关闭文件输入流并释放系统资源
                    } catch (IOException e) {
                        throw new RuntimeException("关闭文件输入流失败!");
                    }
                }
            }
        }
    }
    
    

    对于,如何通过正则检验字符串中的"//out.print(var)",能力不足,还未实现。

  • 相关阅读:
    每日英语:5 Ways the World Will Change Radically This Century
    每日英语:Foreign Visits Rise Amid Europe's Downturn
    vs2010和Matlab R2011b 混合编程的配置
    每日英语:Hon Hai Riot Underlines Rising Tensions in Chinese Factories
    优雅的实现对外接口,要注意哪些问题?
    一文搞定关系数据库设计要领,值得收藏!
    面试官:如果要存 IP 地址,用什么数据类型比较好?
    卧槽!IDEA 写代码防沉迷了?
    面试官:Minor GC、Major GC、Full GC 区别?我竟然答不上来。。
    Spring Boot + Vue + Shiro 实现前后端分离、权限控制
  • 原文地址:https://www.cnblogs.com/YikaJ/p/4366761.html
Copyright © 2011-2022 走看看