代码统计工具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();
        }
      }
    }
  }
}


目录
相关文章
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
143 83
|
3天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
44 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1天前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
34 17
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
56 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
10天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
33 3
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
58 26
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
53 24
|
18天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
54 2
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
76 5
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
55 5