代码统计工具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中的Lambda表达式:简化你的代码之路
【8月更文挑战第66天】Lambda表达式在Java 8中首次引入,它为Java开发者提供了一种更简洁、更灵活的编程方式。本文将通过简单易懂的语言和实际代码示例,引导你理解Lambda表达式的基本概念、语法结构以及如何在Java项目中应用它来简化代码。无论你是Java新手还是有经验的开发者,这篇文章都将帮助你更好地掌握这一强大的工具。
31 11
|
11天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
28 5
|
13天前
|
Java API 开发者
探索Java中的Lambda表达式:简洁与强大的代码实践
本文深入探讨Java中Lambda表达式的定义、用法及优势,通过实例展示其如何简化代码、提升可读性,并强调在使用中需注意的兼容性和效率问题。Lambda作为Java 8的亮点功能,不仅优化了集合操作,还促进了函数式编程范式的应用,为开发者提供了更灵活的编码方式。
|
9天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
10天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
20 3
|
11天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
23 4
|
10天前
|
SQL 安全 Java
JAVA代码审计SAST工具使用与漏洞特征
JAVA代码审计SAST工具使用与漏洞特征
28 1
|
10天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
9 2
|
12天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
12天前
|
JSON Java fastjson
java小工具util系列3:JSON和实体类转换工具
java小工具util系列3:JSON和实体类转换工具
13 2