统计代码行数。。
话说之前直接用eclipse的代码行数统计,但是只能统计文件所有行数,不能统计具体的代码,我按照VC的那个统计行数的插件仿着写了个。。
统计指定扩展名下的总行数、纯代码行数、纯注释行数、代码混合注释行数、空行数以及非空行数。
下面是计算代码,可以控制台调用:
-
import java.util.ArrayList;
-
import java.util.List;
-
import java.util.Scanner;
-
import java.io.File;
-
import java.io.FileNotFoundException;
-
-
/**
-
* 统计行数
-
* @author YOYO
-
*/
-
public class LineCounter
-
{
-
-
/** 搜索的文件扩展名 */
-
public List<String> fileExts = new ArrayList<String>();
-
-
/** 纯代码行数 */
-
private int codeLines = 0;
-
-
/** 代码与注释同一行的行数 */
-
private int codeWithCommentLines = 0;
-
-
/** 注释行数 */
-
private int commentLines = 0;
-
-
/** 空白行数 */
-
private int blankLines = 0;
-
-
/**
-
* 搜索的扩展名
-
*/
-
fileExts.clear();
-
fileExts.add(ext);
-
}
-
}
-
-
/**
-
* 总行数
-
*/
-
public int getTotalLines() {
-
return codeLines + codeWithCommentLines + commentLines + blankLines;
-
}
-
-
/**
-
* 代码行数
-
*/
-
public int getCodeLines() {
-
return codeLines;
-
}
-
-
/**
-
* 注释行数
-
*/
-
public int getCommentLines() {
-
return commentLines;
-
}
-
-
/**
-
* 代码混合注释行数
-
*/
-
public int getCodeWithCommentsLines() {
-
return codeWithCommentLines;
-
}
-
-
/**
-
* 空行数
-
*/
-
public int getBlankLines() {
-
return blankLines;
-
}
-
-
/**
-
* 非空行数
-
*/
-
public int getNonBlankLines() {
-
return getTotalLines() - blankLines;
-
}
-
-
/**
-
* 打印结果
-
*/
-
public void printResult() {
-
int totalLines = codeLines + codeWithCommentLines + commentLines + blankLines;
-
int nonblankLines = totalLines - blankLines;
-
-
}
-
-
/**
-
* 统计行数
-
* @param folder 项目路径
-
*/
-
if (null == file) {
-
return;
-
}
-
-
// 目录 则遍历子文件与文件夹
-
if (file.isDirectory()) {
-
count(file.getPath() + "\\" + fileName);
-
}
-
} else {
-
// 检查是否需要统计的文件类型
-
boolean flag = false;
-
if (folder.endsWith(ext)) {
-
flag = true;
-
break;
-
}
-
}
-
if (!flag) {
-
return;
-
}
-
-
// 统计文件行数
-
try {
-
Scanner scanner = new Scanner(file);
-
String line = null;
-
boolean isComment = false;
-
-
while (scanner.hasNext()) {
-
line = scanner.nextLine();
-
-
// 如果已经有注释开头
-
if (isComment) {
-
int pos = exist(line, "*/");
-
if (pos != -1) {
-
isComment = false;
-
-
line = line.substring(0, pos).trim();
-
-
// 以*/结尾的为纯注释句
-
if (line.length() == 0) {
-
++commentLines;
-
continue;
-
}
-
-
// 同时包含/*的,判断最后一个位置
-
pos = exist(line, "/*");
-
if (pos != -1) {
-
if (existLast(line, "/*") > existLast(line, "*/"))
-
{
-
// 如果最后是/* 则依然在注释状态
-
isComment = true;
-
} else {
-
isComment = false;
-
}
-
-
// 判断中间是否夹杂代码
-
if (hasCodes(line)) {
-
++codeWithCommentLines;
-
} else {
-
++commentLines;
-
}
-
-
} else {
-
// 不包含/*且*/之后还有其他字符,则是代码混合注释
-
++codeWithCommentLines;
-
}
-
} else {
-
// 不包含*/为纯注释句
-
++commentLines;
-
}
-
-
continue;
-
}
-
-
int pos = exist(line, "//");
-
if (pos != -1) {
-
if (line.trim().startsWith("//")) {
-
// 以//打头,纯注释
-
++commentLines;
-
} else {
-
// 并非//打头,代码混合注释
-
++codeWithCommentLines;
-
}
-
continue;
-
}
-
-
// 如果包含
-
pos = exist(line, "/*");
-
if (pos != -1) {
-
// 同时包含*/的,判断最后一个位置
-
pos = exist(line, "*/");
-
if (pos != -1) {
-
if (existLast(line, "/*") > existLast(line, "*/")) {
-
// 如果最后是/* 则依然在注释状态
-
isComment = true;
-
} else {
-
isComment = false;
-
}
-
-
// 判断中间是否夹杂代码
-
if (hasCodes(line)) {
-
++codeWithCommentLines;
-
} else {
-
++commentLines;
-
}
-
-
} else {
-
isComment = true;
-
++commentLines;
-
}
-
-
continue;
-
}
-
-
// 空行
-
if (line.trim().length() == 0) {
-
++blankLines;
-
continue;
-
}
-
-
// 不包含//,则是纯代码
-
++codeLines;
-
}
-
}
-
e.printStackTrace();
-
}
-
}
-
}
-
-
int len = 0;
-
while (true) {
-
if (line.length() < len) {
-
return -1;
-
}
-
-
if (!str.contains(substr)) {
-
return -1;
-
}
-
-
str = str.substring(0, str.indexOf(substr));
-
-
int t = 0;
-
for (int i = 0; i < str.length(); ++i) {
-
if (str.charAt(i) == '"' && (i == 0 || str.charAt(i - 1) != '\\')) {
-
++t;
-
}
-
}
-
if (t % 2 == 0) {
-
return len + str.length();
-
}
-
len = str.length() + 1;
-
}
-
}
-
-
int len = line.length();
-
while (true) {
-
if (!str.contains(substr)) {
-
return -1;
-
}
-
-
str = str.substring(0, str.lastIndexOf(substr));
-
int t = 0;
-
for (int i = 0; i < str.length(); ++i) {
-
if (str.charAt(i) == '"') {
-
++t;
-
}
-
}
-
if (t % 2 == 0) {
-
return str.length();
-
}
-
len = str.length() - 1;
-
}
-
}
-
-
if (line.length() == 0) {
-
return false;
-
}
-
-
return false;
-
}
-
-
{
-
String folder = null;
-
-
if (args.length == 0) {
-
folder = scanner.nextLine();
-
} else {
-
folder = args[0];
-
}
-
-
LineCounter counter = new LineCounter();
-
counter.setFileExts(".java", ".jsp");
-
counter.count(folder);
-
counter.printResult();
-
}
-
}
-
顺便做了一个壳,调用该类进行计算,对文件的扩展名米有测试,截图如下,选中打开的目录后即开始计算并将结果显示。
根据项目文件的数量、代码行数的多少,效率会有差别。。
UI代码:
-
import java.awt.Component;
-
import java.awt.Dimension;
-
import java.awt.FlowLayout;
-
import java.awt.GridLayout;
-
import java.awt.Toolkit;
-
import java.awt.event.ActionEvent;
-
import java.awt.event.ActionListener;
-
import java.io.File;
-
-
import javax.swing.JButton;
-
import javax.swing.JFileChooser;
-
import javax.swing.JFrame;
-
import javax.swing.JLabel;
-
import javax.swing.JPanel;
-
import javax.swing.JTextField;
-
-
-
/**
-
*
-
*/
-
private static final long serialVersionUID = 1L;
-
-
-
-
public LineCounterUI() {
-
this.configures();
-
this.fillComponents();
-
this.setVisible(true);
-
}
-
-
private void configures() {
-
this.setTitle("统计行数用");
-
this.setSize(450, 180);
-
.getDefaultToolkit().getScreenSize().getHeight() - this
-
.getHeight()) / 2);
-
}
-
-
private void fillComponents() {
-
-
/**
-
*
-
*/
-
private static final long serialVersionUID = 1L;
-
-
{
-
this.add(tfTotalLines);
-
this.add(tfBlankLines);
-
this.add(tfNonBlankLines);
-
this.add(tfCodeLines);
-
this.add(tfCommentLines);
-
this.add(tfCodeWithCommentLines);
-
-
tfTotalLines.setEditable(false);
-
tfBlankLines.setEditable(false);
-
tfNonBlankLines.setEditable(false);
-
tfCodeLines.setEditable(false);
-
tfCommentLines.setEditable(false);
-
tfCodeWithCommentLines.setEditable(false);
-
-
}
-
});
-
-
this.add(tfExts);
-
-
this.add(btn);
-
-
@Override
-
fileChooser.setApproveButtonText("统计");
-
fileChooser.setDialogTitle("选择要统计行数的目录");
-
LineCounter counter = new LineCounter();
-
counter.setFileExts(tfExts.getText().split(", "));
-
counter.count(file.getAbsolutePath());
-
-
}
-
}
-
-
});
-
}
-
-
/**
-
* @param args
-
*/
-
new LineCounterUI();
-
}
-
-
}
- 无匹配