代码量统计

  最近无聊,想知道自己3年来敲了多少代码。于是自己就动手写了,留下个足迹吧

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class coderCounter extends JFrame{
    private long normalLines = 0;
    private long commentLines = 0;
    private long whiteLines = 0;
    private JButton jButton1;
    private JTextArea jTextArea1;
    private JScrollPane jScrollPane1;
    private JTextField jTextField1;
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
    private static final long serialVersionUID = 1L;
    private FilterBySuffix fileter = new FilterBySuffix(".java");
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                coderCounter inst = new coderCounter();
                inst.setLocationRelativeTo(null);
                inst.setVisible(true);
            }
        });
        
    }
    
    public  coderCounter() {
        initGUI();
    }
    
    private void initGUI() {
        try {
            setTitle("代码量统计小软件");
            setResizable(false);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            getContentPane().setLayout(null);
            {
                jButton1 = new JButton();
                getContentPane().add(jButton1);
                jButton1.setText("\u786e\u5b9a");
                jButton1.setBounds(466, 21, 128, 50);
                jButton1.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        jButton1ActionPerformed(evt);
                    }
                });
            }
            {
                jTextField1 = new JTextField();
                getContentPane().add(jTextField1);
                jTextField1.setBounds(17, 21, 437, 50);
                jTextField1.setText("输入Eclispe的工作空间路径,可以统计代码量,注释,空白行数");
                jTextField1.addKeyListener(new KeyAdapter() {
                    public void keyPressed(KeyEvent evt) {
                        jTextField1KeyPressed(evt);
                    }
                });
            }
            {
                jScrollPane1 = new JScrollPane();
                getContentPane().add(jScrollPane1);
                jScrollPane1.setBounds(17, 83, 577, 272);
                {
                    jTextArea1 = new JTextArea();
                    jTextArea1.setEditable(false);
                    jScrollPane1.setViewportView(jTextArea1);
                }
            }
            pack();
            this.setSize(626, 401);
        } catch (Exception e) {
            //add your error handling code here
            e.printStackTrace();
        }
    }
    
    private void jButton1ActionPerformed(ActionEvent evt) {        
        showDir();
    }

    private void showDir() {
        //通过在文本框输入具体的目录,将目录中的当前文件或者文件夹的名称列出到文本区域中。
        /*
         * 思路:
         * 1,获取文本框中的路径。
         * 2,将路径封装成File对象。;
         */
        
        //1,获取路径。通过文本框对象完成。
    String str_dir = jTextField1.getText();    
        //2,将字符串路径封装成File对象。
        File dir = new File(str_dir);
        //遍历
        getFilelist(dir);      
        jTextArea1.append("代码量:"+normalLines+LINE_SEPARATOR);
        jTextArea1.append("注释量::" + commentLines+LINE_SEPARATOR);
        jTextArea1.append("空白行:" + whiteLines+LINE_SEPARATOR);
    }
    
    private void jTextField1KeyPressed(KeyEvent evt) {
        
        if(evt.getKeyCode()==KeyEvent.VK_ENTER){
            showDir();
        }
        
    }
    
    private  void getFilelist(File dir){
        /**
         * 对指定目录进行递归。
         * 多级目录下都要用到相同的集合和过滤器。那么不要在递归方法中定义,而是不断的进行传递。
         * @param dir 需要遍历的目录。
         * @param filter 接收指定的过滤器。
         */
        File [] files = dir.listFiles();//通过listFiles方法,获取dir当前下的所有的文件和文件夹对象。
        
        for(File f:files){  //遍历文件夹数组,如果是文件夹,继续遍历。
            if(f.isDirectory() && !f.isHidden() && f.canWrite()){
                getFilelist(f);
            }else 
                if(fileter.accept(f)){//通过过滤器对文件进行筛选。。               
                       parse(f);
                       jTextArea1.append(f+LINE_SEPARATOR);                
            }  
        }
    }
    private void parse(File file) {
        
        BufferedReader bf = null;
        boolean comment = false;
        
        try {
            bf = new BufferedReader(new FileReader(file));
            String line = "";
            while((line = bf.readLine()) != null){
                line = line.trim();
                if(line.matches("^[[\\s] && [^\\n]]*$")) {
                    whiteLines ++; 
                } else if (line.startsWith("/*") && !line.endsWith("*/")) {
                    commentLines ++;
                    comment = true;    
                } else if (line.startsWith("/*") && line.endsWith("*/")) {
                    commentLines ++;
                } else if (comment) {
                    commentLines ++;
                    if(line.endsWith("*/")) {
                        comment = false;
                    }
                } else if (line.startsWith("//")) {
                    commentLines ++;
                } else {
                    normalLines ++;
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(bf != null)
                try {
                    bf.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }    
    }
}
class FilterBySuffix implements FilenameFilter {
    private String suffix;
    public FilterBySuffix(String suffix) {
        this.suffix = suffix;
    }
    public boolean accept(File dir) {

        return dir.getName().endsWith(suffix);
    }

}
interface FilenameFilter {
    public boolean accept(File dir);
}

 

posted @ 2017-04-19 23:02  爆发的小宇宙00  阅读(328)  评论(0编辑  收藏  举报