统计你写的java代码行数

自动统计工具

SourceCounter-2.5.5.9,可以统计多种开发语言的代码量,包括C#、ava;支持多种文字,包括简体中文。

Java时,指定到webroot目录,选择java,jsp,xml,html类型,系统会自动计算。

junit的单元测试,也会统计出来。

程序注释的行数,也在统计范围,很不错。

非安装版的,运行.exe文件时出界面,不安装,呵呵。 

 

用C#制作源代码统计,http://www.docin.com/p-32733695.html

 

代码一:

  import java.io.BufferedReader;

  import java.io.File;

  import java.io.FileNotFoundException;

  import java.io.FileReader;

  import java.io.IOException;

  /**

  *

  * @author LC

  *

  */

  public class SumJavaCode {

  static long normalLines = 0; // 空行

  static long commentLines = 0; // 注释行

  static long whiteLines = 0; // 代码行

  public static void main(String[] args) {

  SumJavaCode sjc = new SumJavaCode();

  File f = new File(“D://spring-framework-2.0-with-dependencies//spring-framework-2.0″); //目录

  System.out.println(f.getName());

  sjc.treeFile(f);

  System.out.println(“空行:” + normalLines);

  System.out.println(“注释行:” + commentLines);

  System.out.println(“代码行:” + whiteLines);

  }

  /**

  * 查找出一个目录下所有的.java文件

  *

  * @param f 要查找的目录

  */

 

 

 

  private void treeFile(File f) {

  File[] childs = f.listFiles();

  //int count = 0;

  //int sum = 0;

  for (int i = 0; i < childs.length; i++) {

  // System.out.println(preStr + childs[i].getName());

  if (!childs[i].isDirectory()) {

  if (childs[i].getName().matches(“.*//.java$”)) {

  System.out.println(childs[i].getName());

  //count ++;

  sumCode(childs[i]);

  }

  } else {

  treeFile(childs[i]);

  //sum += count;

  }

  }

  }

  /**

  * 计算一个.java文件中的代码行,空行,注释行

  *

  * @param file

  * 要计算的.java文件

  */

 

  private void sumCode(File file) {

  BufferedReader br = null;

  boolean comment = false;

  try {

  br = new BufferedReader(new FileReader(file));

  String line = “”;

  try {

  while ((line = br.readLine()) != null) {

  line = line.trim();

  if (line.matches(“^[//s&&[^//n]]*$”)) {

  whiteLines++;

  } else if (line.startsWith(“/*”) && !line.endsWith(“*/”)) {

  commentLines++;

  comment = true;

  } else if (true == comment) {

  commentLines++;

  if (line.endsWith(“*/”)) {

  comment = false;

  }

  } else if (line.startsWith(“//”)) {

  commentLines++;

  } else {

  normalLines++;

  }

  }

  } catch (IOException e) {

  e.printStackTrace();

  }

  } catch (FileNotFoundException e) {

  e.printStackTrace();

  } finally {

  if (br != null) {

  try {

  br.close();

  br = null;

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  }

  }

  }

 

代码二:

package linenum;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.text.*;
import javax.swing.*;

public class LineNum extends JFrame
{
private JPanel topPanel = new JPanel();
private JPanel bottomPanel = new JPanel();
private JButton fileChoose = new JButton("选择目录");
private JTextField fileField = new JTextField(20);
private JFileChooser fc = new JFileChooser("选择目录");
private JTextArea filePathArea = new JTextArea(5 , 20);
//判断是否属于"/* */注释"
private boolean isExplainStatus = false;

//存储代码总行数值
private int totalCount = 0;
//存储注释总行数值
private int explainCount = 0;
//存储空行总行数值
private int spaceCount = 0;
//存储单个文件行数值
private int count = 0;
private InputStream input = null;
private BufferedReader br = null;

private String totalPath = "";
private DecimalFormat myFormat = null;

public LineNum(String title)
{
     super(title);
     //设置面板
        Container container = getContentPane();
        container.setLayout(new BorderLayout());
        topPanel.setLayout(new GridLayout(1 , 2));
        bottomPanel.setLayout(new BorderLayout());
        topPanel.add(fileChoose);
        topPanel.add(fileField);
        bottomPanel.add(new JScrollPane(filePathArea));
        filePathArea.setText("java文件:");
        container.add(topPanel , BorderLayout.NORTH);
        container.add(bottomPanel , BorderLayout.CENTER);
       
        //添加选择目录监听,默认获取的是选择文件所在的父目录,程序统计对象是此父目录及其子目录下的所有java文件
        fileChoose.addActionListener(new ActionListener()
        {
    public void actionPerformed(ActionEvent e)
    {    
     int result = fc.showOpenDialog(LineNum.this);
     if(result == JFileChooser.APPROVE_OPTION)
     {     
      String path = fc.getSelectedFile().getAbsolutePath();
      path = path.substring(0 , path.lastIndexOf("//"));
                    fileField.setText(path);
                    File file = new File(path);
                    CalculateLineNum(file);
     }
    }
        });
}

/*
* 计算并显示统计信息
*/
private void CalculateLineNum(File file)
{
   if(file.exists())
   {
    displayLineNum(file);
    myFormat = (DecimalFormat)NumberFormat.getPercentInstance();
    myFormat.applyPattern("0.00%");
    if(totalCount != 0)
    {
       double programPercent = (double)(totalCount - explainCount - spaceCount)/(double)totalCount;
       double explainPercent = (double)explainCount/(double)totalCount;
       double spacePercent = (double)spaceCount/(double)totalCount;
       filePathArea.setText(filePathArea.getText() + "/n" + " 总行数:" + totalCount + "行");
       filePathArea.setText(filePathArea.getText() + "/n" + " 程序行数:" + (totalCount - explainCount - spaceCount) + "行,百分比:"+myFormat.format(programPercent));
       filePathArea.setText(filePathArea.getText() + "/n" + " 注释行数:" + explainCount + "行,百分比:"+myFormat.format(explainPercent));
       filePathArea.setText(filePathArea.getText() + "/n" + " 空行行数:" + spaceCount + "行,百分比:"+myFormat.format(spacePercent));
    }
    else
    {
     filePathArea.setText(filePathArea.getText() + "/n" + " 总行数:" + totalCount + "行");
    }
   }
}

//循环访问目录及子目录,统计代码总行数,注释行数及空行行数
public void displayLineNum(File file)
{
   totalPath+= "   ||   " + file.getName();
   String[] subPaths = file.list();
   if(subPaths.length == 0)
   {
    totalPath = totalPath.substring(0 , totalPath.lastIndexOf("   ||   "));
    return;
   }   
   //循环对子目录进行访问计算行数处理
   for(int i = 0 ; i < subPaths.length ; i++)
   {
    count = 0;
    File subFile = new File(file.getAbsolutePath() + "//" + subPaths[i]);
    if(subFile.isFile())
    {
       String subFilePath = subFile.getAbsolutePath();
       String extendName = subFilePath.substring(subFilePath.lastIndexOf(".") + 1 , subFilePath.length());
       if(!extendName.equals("java"))
       {
        continue;
       }
       try
       {
           input = new FileInputStream(subFile);
           BufferedReader br = new BufferedReader(new InputStreamReader(input));
           String lineValue = br.readLine();
           while(lineValue != null)
           {
               count++;
               //对两种不同类型注释分别处理,对空行用空字符串来判断
               if(isExplainStatus == false)
               {
             if(lineValue.trim().startsWith("//"))
             {
              explainCount++;
             }
             if(lineValue.trim().equals(""))
             {
              spaceCount++;
             }
             if(lineValue.trim().startsWith("/*"))
             {
             explainCount++;
              isExplainStatus = true;
             }
               }
               else
               {
               explainCount++;
             if(lineValue.trim().startsWith("*/"))
             {
              isExplainStatus = false;
             }
               }
         lineValue = br.readLine();
        }
        totalCount+= count;           
        String totalPath1 = totalPath + "   ||   " + subFile.getName();
       
        //显示单个文件的行数
        filePathArea.setText(filePathArea.getText() + "/n" + totalPath1 + "   行数:" + count + "行--------totalCount:"+ totalCount);
        br.close();
        input.close();
     }
     catch (Exception e)
     {    
        e.printStackTrace();
     }
    }
    else
    {     
     //循环调用displayLineNum函数,实现统计子目录行数数据
       displayLineNum(subFile);
    }
   }
   totalPath = totalPath.substring(0 , totalPath.lastIndexOf("   ||   "));
}

public static void main(String args[])
{
   LineNum lineFrame=new LineNum("java程序行数统计");
   lineFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   lineFrame.setBounds(212,159,600,420);
   lineFrame.setVisible(true);
   lineFrame.setResizable(false);
}
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值