代码统计工具java 实现

简介: 2.核心处理统计方法。
源码和工具下载地址
http://download.csdn.net/detail/wangshuai6707/9497405
http://download.csdn.net/detail/wangshuai6707/9497404
</pre><pre code_snippet_id="1655032" snippet_file_name="blog_20160420_1_7495149" name="code" class="java">用windowbuilder 写的图形界面
package com.ws.view;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import com.ws.dmtjtool.CodeCounter;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.ImageIcon;
import java.awt.Toolkit;
public class Main extends JFrame {
  private JPanel contentPane;
  private JTextField textField;
  private JTextField textField_1;
  private JTextField textField_2;
  private JTextField textField_3;
  /**
   * Launch the application.
   */
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        try {
          Main frame = new Main();
          frame.setVisible(true);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }
  /**
   * Create the frame.
   */
  public Main() {
    setIconImage(Toolkit.getDefaultToolkit().getImage("1.ico"));
    setTitle("帅子代码统计工具V1.0");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 518, 340);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    JPanel panel = new JPanel();
    panel.setBounds(5, 5, 424, 1);
    contentPane.add(panel);
    panel.setLayout(null);
    JLabel label = new JLabel("输入你的工程路径:");
    label.setBounds(5, 30, 116, 15);
    contentPane.add(label);
    textField = new JTextField();
    textField.setBounds(120, 27, 161, 21);
    contentPane.add(textField);
    textField.setColumns(10);
    JLabel label_1 = new JLabel("如:F:/myProject/ECP-OPEN/");
    label_1.setBounds(291, 30, 186, 15);
    contentPane.add(label_1);
    JButton button = new JButton("点击开始统计");
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        textField_1.setText("");
        textField_2.setText("");
        textField_3.setText("");
        CodeCounter.codeLines=0;
        CodeCounter.commentLines=0;
        CodeCounter.blankLines=0;
        CodeCounter.fileArray=new ArrayList<File>();
        String path="";
        path=textField.getText();
        path = path.replace("/", "\\");
        File file = new File(path);//F:\myProject\ECP-OPEN
        if(!path.matches("^[A-z]:\\\\(.+?\\\\)*$")){
          JOptionPane.showMessageDialog(null, "工程路径不合法!", "温馨提示", JOptionPane.ERROR_MESSAGE); 
        }else{
          if (!file.exists()) {
            JOptionPane.showMessageDialog(null, "工程路径不存在!请核对", "温馨提示", JOptionPane.ERROR_MESSAGE); 
          }else{
            ArrayList<File> al = CodeCounter.getFile(file);
            for (File f : al) {
              if (f.getName().matches(".*\\.java$")) // 匹配java格式的文件
                CodeCounter.count(f);
            }
            textField_1.setText(CodeCounter.codeLines+"");
            textField_2.setText(CodeCounter.commentLines+"");
            textField_3.setText(CodeCounter.blankLines+"");
          }
        }
      }
    });
    button.setBounds(321, 72, 131, 55);
    contentPane.add(button);
    JLabel lblNewLabel = new JLabel("统计结果展示:");
    lblNewLabel.setBounds(15, 64, 131, 15);
    contentPane.add(lblNewLabel);
    JLabel lblNewLabel_1 = new JLabel("代码行数:");
    lblNewLabel_1.setBounds(5, 92, 73, 15);
    contentPane.add(lblNewLabel_1);
    JLabel lblNewLabel_2 = new JLabel("注释行数:");
    lblNewLabel_2.setBounds(5, 128, 91, 15);
    contentPane.add(lblNewLabel_2);
    JLabel lblNewLabel_3 = new JLabel("空白行数:");
    lblNewLabel_3.setBounds(5, 159, 91, 15);
    contentPane.add(lblNewLabel_3);
    textField_1 = new JTextField();
    textField_1.setEnabled(false);
    textField_1.setBounds(120, 89, 138, 21);
    contentPane.add(textField_1);
    textField_1.setColumns(10);
    textField_2 = new JTextField();
    textField_2.setEnabled(false);
    textField_2.setBounds(120, 125, 138, 21);
    contentPane.add(textField_2);
    textField_2.setColumns(10);
    textField_3 = new JTextField();
    textField_3.setEnabled(false);
    textField_3.setBounds(120, 156, 138, 21);
    contentPane.add(textField_3);
    textField_3.setColumns(10);
    JLabel lblNewLabel_4 = new JLabel("更多常用工具请访问我们冰点科技团队,草根吧论坛网(www.caogen8.co)");
    lblNewLabel_4.setBounds(15, 184, 487, 21);
    contentPane.add(lblNewLabel_4);
    JLabel lblNewLabel_5 = new JLabel("更多精美UI设计素材,请访问ui设计之家(www.uiuehome.com)");
    lblNewLabel_5.setBounds(15, 215, 487, 15);
    contentPane.add(lblNewLabel_5);
    JLabel lblNewLabel_6 = new JLabel("我们的官网:www.bdkjzx.com,联系作者QQ2374212111");
    lblNewLabel_6.setBounds(10, 251, 472, 15);
    contentPane.add(lblNewLabel_6);
    JButton btnNewButton = new JButton("清空统计结果");
    btnNewButton.setIcon(new ImageIcon("41c643d15d_32.ico"));
    btnNewButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        textField_1.setText("");
        textField_2.setText("");
        textField_3.setText("");
        CodeCounter.codeLines=0;
        CodeCounter.commentLines=0;
        CodeCounter.blankLines=0;
      }
    });
    btnNewButton.setBounds(321, 137, 131, 23);
    contentPane.add(btnNewButton);
  }
}

2.核心处理统计方法。

package com.ws.dmtjtool;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class CodeCounter {
  public static long codeLines = 0;
  public static long commentLines = 0;
  public static long blankLines = 0;
  public static ArrayList<File> fileArray = new ArrayList<File>();
  /**
   * 可以统计指定目录下以及其子目录下的所有java文件中代码
   * 
   * @author wangshuai
   */
  public static void main(String[] args) {
    String path="F:/myProject/ECP-OPEN/";
    path = path.replace("/", "\\");
    File file = new File(path);//F:\myProject\ECP-OPEN
    System.out.println(path.matches("^[A-z]:\\\\(.+?\\\\)*$"));
    if(!path.matches("^[A-z]:\\\\(.+?\\\\)*$")){
      System.out.println("请输入正确路径");
    }
    if (!file.exists()) {
        System.out.println("文件夹不存在");
    }
    ArrayList<File> al = getFile(file);
    for (File f : al) {
      if (f.getName().matches(".*\\.java$")) // 匹配java格式的文件
        count(f);
    }
    System.out.println("代码行数:" + codeLines);
    System.out.println("注释行数:" + commentLines);
    System.out.println("空白行数: " + blankLines);
  }
  // 获得目录下的文件和子目录下的文件
  public static ArrayList<File> getFile(File f) {
    File[] ff = f.listFiles();
    for (File child : ff) {
      if (child.isDirectory()) {
        getFile(child);
      } else
        fileArray.add(child);
    }
    return fileArray;
  }
  // 统计方法
  public static void count(File f) {
    BufferedReader br = null;
    boolean flag = false;
    try {
      br = new BufferedReader(new FileReader(f));
      String line = "";
      while ((line = br.readLine()) != null) {
        line = line.trim(); // 除去注释前的空格
        if (line.matches("^[ ]*$")) { // 匹配空行
          blankLines++;
        } else if (line.startsWith("//")) {
          commentLines++;
        } else if (line.startsWith("/*") && !line.endsWith("*/")) {
          commentLines++;
          flag = true;
        } else if (line.startsWith("/*") && line.endsWith("*/")) {
          commentLines++;
        } else if (flag == true) {
          commentLines++;
          if (line.endsWith("*/")) {
            flag = false;
          }
        } else {
          codeLines++;
        }
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (br != null) {
        try {
          br.close();
          br = null;
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}


目录
相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
26天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
53 2
|
26天前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
105 2
|
28天前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
34 1
|
19天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
33 5
Java反射机制:解锁代码的无限可能
|
15天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
48 3
|
20天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
59 10
|
16天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
20天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。