规则:以";","{","}"结束的行为有效行;
1.接收一个文件或目录;
2.读单个文件或目录下的多个文件;
3.排除package行;
4.排除import行;
5.排除空白行;
6.排除单行注释;
7.排除文档注释;
8.去掉无效";";
9.去掉块注释;
源码如下:
package com.zzxsl.io; import java.io.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Grover on 05/06/2016. */ public final class Statistics { /** * 数量 */ private int count; public Statistics(String filePath) { File file = new File(filePath); if (!file.exists()){ //判断是否存在 return; } if (file.isFile()){ //判断是否为文件 readFile(file); return; } //目录 findFile(file); } /** * 在目录中找.java文件 * @param dir */ private void findFile(File dir) { for (File file : dir.listFiles()) { if(file.isDirectory()){ findFile(file); continue; } readFile(file); } } /** * 读文件 * @param file */ private void readFile(File file) { if(!file.getName().endsWith(".java")){ return; } try { BufferedReader fileReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String line; StringBuilder content = new StringBuilder(); while ((line = fileReader.readLine()) != null){ line = exclusionInvalidSemicolon(line.trim()); if(line.startsWith("package") || line.startsWith("import") || line.equals("") //空行 || line.startsWith("//")){ //单行注释 continue; } content.append(line); } exclusionCommentAndCalculate(content.toString()); } catch (UnsupportedEncodingException e) { System.err.println("不支持用指定编码解析!"); e.printStackTrace(); } catch (FileNotFoundException e) { System.err.println("文件路径不存在!"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 去掉文档注释和块注释,并计算";"数量 * @param content * @return */ private void exclusionCommentAndCalculate(String content) { calculateSemicolonCount(content.replaceAll("/\\*.*?\\*/","")); } /** * 计算";"数量; * @param text */ private void calculateSemicolonCount(String text) { Matcher matcher = Pattern.compile("[;\\{\\}]").matcher(text); while (matcher.find()){ count += 1; } } /** * 去掉无效的分号 * @param text * @return */ private String exclusionInvalidSemicolon(String text) { return text.replaceAll("^;*","").replaceAll(";.*//.*",";"); } public int getCount() { return count; } }