开发者社区> 问答> 正文

java初学者弱弱的求组关于文件读取问题

读一个文件名称,
如果是.java文件,就分析出 代码行数、空行数、注释行数。
如果是文件夹,就递归分析出该文件夹下的每个java文件的代码行数、空行数、注释行数。
统计注释率、空行率、有效代码率。
把结果使用对象流保存到本地文件,可以随时读取。

这个应该怎么实现啊

展开
收起
爵霸 2016-06-08 11:07:19 2105 0
1 条回答
写回答
取消 提交回答
  • package cn.slahser.util;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.util.HashSet;
    import java.util.Set;
     
    /**
     * 代码行统计工具
     * 
     * @author xiaoE
     * */
    public class CodeCount {
         
        /** 不统计与主程序无关文件 */
        public static final Set<String> OUT_FILE;
         
        static {
            OUT_FILE = new HashSet<String>();
            // 代码备份工具
            OUT_FILE.add("CodeBackup.java");
            // 代码行统计工具
            OUT_FILE.add("CodeCount.java");
        }
         
        /** 代码行 */
        public long code;
        /** 注释行 */
        public long doc;
        /** 空行 */
        public long sp;
         
        private CodeCount(){}
         
        /**
         * 递归目录下所有的.java文件
         * 
         * @author xiaoE
         * @param dir 要查找的目录
         * @throws Exception
         */
        private void conuntAllFile(File dir) throws Exception {
            File[] childs = dir.listFiles();
            for (int i = 0; i < childs.length; i++) {
                if(OUT_FILE.contains(childs[i].getName())) {
                    continue;
                }
                if (childs[i].isDirectory()) {
                    this.conuntAllFile(childs[i]);
                } else if (childs[i].getName().matches(".*\\.java$")) {
                    this.countCodeInFile(childs[i]);
                }
            }
        }
     
        /**
         * 统计单个文件的
         * 代码行,空行,注释行
         * 
         * @author xiaoE
         * @param file 要统计文件
         * @throws Exception 
         */
        private void countCodeInFile(File file) throws Exception {
            BufferedReader br = null;
            boolean isComment = false;
            br = new BufferedReader(new FileReader(file));
            String line = "";
            while ((line = br.readLine()) != null) {
                line = line.trim();
                if (line.matches("^[\\s&&[^\\n]]*$")) {
                    // 满足正则表达式,则为空行
                    this.sp++;
                } else if (line.startsWith("/*") || isComment) {
                    // 以「/*」开头的为注释
                    this.doc++;
                    // 不以「*/」结尾,则下一行是注释
                    isComment = !line.endsWith("*/");
                } else if (line.startsWith("//")) {
                    // 以「//」开头的为注释
                    this.doc++;
                } else {
                    // 其余为代码行
                    this.code++;
                }
            }
            br.close();
        }
     
        public static void main(String[] args) throws Exception {
            CodeCount count = new CodeCount();
            count.conuntAllFile(new File("src"));
            System.out.println("代码行:\t" + count.code);
            System.out.println("注释行:\t" + count.doc);
            System.out.println("空行:\t" + count.sp);
        }
    }
     
    2019-07-17 19:31:26
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载