前几天需要知道某个文件(c,cpp,java)的行数,自己做了一个统计源代码行数的一个小小的软件,想跟大家分享。
Java源代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;
public class CodeLineCounter extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
//顶部,底部容器
private JPanel topPanel,bottomPanel, panel;
//欢迎,目录标签
private JLabel welcomeLabel, catalogLabel;
private DefaultListModel listModel;
//统计处于列表
private JList statusArea;
//目录文本框
private JTextField catalogField;
//打开文件,统计,重置,退出等按钮
private JButton explorBtn, statusBtn, resetBtn, exitBtn;
//文件选择器
private JFileChooser chooser = new JFileChooser();
//统计标记
private boolean isAlreadyStat = false;
// 判断是否属于"/* */注释"
private boolean isExplainStatus = false;
//行数数列
private int[] count;
//存储代码总行数值
private int totalCount = 0;
//存储单个文件行数值
private int codeCount = 0;
//存储注释总行数值
private int explainCount = 0;
//存储空行总行数值
private int spaceCount = 0;
private InputStream input = null;
private BufferedReader br = null;
public CodeLineCounter(String title) {
super(title);
//设置大小和显示位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setBounds((screenSize.width - 505)/2, (screenSize.height - 379)/2, 505, 379);
//设置布局
this.setLayout(new BorderLayout());
//创建顶层容器
topPanel = new JPanel();
this.add(topPanel, BorderLayout.NORTH);
//创建欢迎标签
welcomeLabel = new JLabel();
welcomeLabel.setForeground(Color.RED);
String space = " " + " ";
welcomeLabel.setText(" 欢迎您使用Java版源代码行数计数器!" + space);
topPanel.add(welcomeLabel);
//创建统计区域列表
listModel = new DefaultListModel();
for(int i = 0;i < 15;i++)
listModel.addElement(" ");
statusArea = new JList(listModel);
statusArea.setSelectionBackground(Color.WHITE);
statusArea.setSelectionForeground(Color.BLACK);
this.add(statusArea, BorderLayout.CENTER);
//创建底部容器
bottomPanel = new JPanel();
bottomPanel.setLayout(new GridLayout(3, 1));
this.add(bottomPanel, BorderLayout.SOUTH);
panel = new JPanel();
bottomPanel.add(panel);
//创建目录标签
catalogLabel = new JLabel("源代码路径:");
panel.add(catalogLabel);
//创建目录文本框
catalogField = new JTextField(50);
panel.add(catalogField);
//打开文件按钮
explorBtn = new JButton("打开文件...");
explorBtn.addActionListener(new ButtonActionListener());
panel.add(explorBtn);
panel = new JPanel();
bottomPanel.add(panel);
panel.add(new JLabel("※※※※※★★★★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★★★★★※※※※※"));
panel = new JPanel();
bottomPanel.add(panel);
//创建统计按钮
statusBtn = new JButton("统计");
statusBtn.addActionListener(new ButtonActionListener());
panel.add(statusBtn);
//占位标签
panel.add(new JLabel(" "));
//创建重置按钮
resetBtn = new JButton("重置");
resetBtn.addActionListener(new ButtonActionListener());
panel.add(resetBtn);
//占位标签
panel.add(new JLabel(" "));
//创建退出按钮
exitBtn = new JButton("退出");
exitBtn.addActionListener(new ButtonActionListener());
panel.add(exitBtn);
}
/**
* 注册按钮监听事件
*/
class ButtonActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getSource() == explorBtn) {
chooser.setDialogTitle("打开");
CodeLineCounter.fileFilter(chooser);
chooser.showOpenDialog(null);
File file = chooser.getSelectedFile();
if(file != null) {
isAlreadyStat = false;
String type = chooser.getName(file).substring(chooser.getName(file).indexOf(".") + 1).toLowerCase();
//System.out.println(type);
if(type != null && (type.equals("java") || type.equals("c") || type.equals("cpp"))) {
catalogField.setText(file.getAbsolutePath());
} else {
String[] msg = {"类型错误!!!!!!", "统计类型为‘java’,‘c’,‘cpp’。"};
JOptionPane.showMessageDialog(null, msg, "友情提示", JOptionPane.INFORMATION_MESSAGE);
}
}
} else if(e.getSource() == statusBtn) {
if(!isAlreadyStat) {
File file = chooser.getSelectedFile();
if(file != null) {
String name = chooser.getName(file);
String type = name.substring(name.indexOf(".") + 1).toLowerCase();
System.out.println(type);
System.out.println(statusArea.getSize().width);
int[] countArray = getLineCount(chooser);
listModel.add(1, "正在获取文件类型...");
listModel.add(2, " 统计文件类型:" + type + "文件");
listModel.add(4, "正在获取文件名称...");
listModel.add(5, " 统计文件名称:" + name);
listModel.add(8, "正在统计源代码行数...");
listModel.add(9, " 程序行数:※※※※※ <" + countArray[1] + "行> ※※※※※");
listModel.add(10, " 注释行数:※※※※※ <" + countArray[2] + "行> ※※※※※");
listModel.add(11, " 空行行数:※※※※※ <" + countArray[3] + "行> ※※※※※");
listModel.add(13, " 总 行 数:<" + countArray[0] + "行>");
isAlreadyStat = true;
} else {
JOptionPane.showMessageDialog(null, " 请选择要统计的源代码。", "友情提示", JOptionPane.INFORMATION_MESSAGE);
}
}
} else if(e.getSource() == resetBtn) {
for(int i = 0;i < 15;i++)
listModel.add(i, " ");
catalogField.setText("");
//isAlreadyStat = false;
} else if(e.getSource() == exitBtn) {
System.exit(0);
}
}
}
/**
* 过滤器
*/
private static void fileFilter(JFileChooser chooser) {
chooser.setAcceptAllFileFilterUsed(false);
chooser.setFileFilter(new FileFilter() {
public boolean accept(File f) {
return ((f.getName().endsWith(".java")) || (f.isDirectory()));
}
public String getDescription() {
return "Java源程序(*.java)";
}
});
chooser.setFileFilter(new FileFilter() {
public boolean accept(File f) {
return ((f.getName().endsWith(".c")) || (f.isDirectory()));
}
public String getDescription() {
return "C源程序(*.c)";
}
});
chooser.setFileFilter(new FileFilter() {
public boolean accept(File f) {
return ((f.getName().endsWith(".cpp")) || (f.isDirectory()));
}
public String getDescription() {
return "C++源程序(*.cpp)";
}
});
chooser.addChoosableFileFilter(new FileFilter() {
public boolean accept(File f) {
return true;
}
public String getDescription() {
return "所有文件(*.*)";
}
});
}
/**
* @param chooser
* 获取行数
*/
public int[] getLineCount(JFileChooser chooser) {
count = new int[4];
try {
input = new FileInputStream(chooser.getSelectedFile());
br = new BufferedReader(new InputStreamReader(input));
String lineValue = br.readLine();
while(lineValue != null) {
codeCount++;
//对两种不同类型注释分别处理,对空行用空字符串来判断
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 = codeCount + explainCount + spaceCount;
count[0]= totalCount;
count[1]= codeCount;
count[2]= explainCount;
count[3]= spaceCount;
br.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return count;
}
/**
* @param args
*/
public static void main(String[] args) {
//设置感官
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
CodeLineCounter counter = new CodeLineCounter("源代码行数计数器 v1.0");
counter.pack();
counter.setResizable(false);
counter.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
counter.setVisible(true);
}
}
Java源代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;
public class CodeLineCounter extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
//顶部,底部容器
private JPanel topPanel,bottomPanel, panel;
//欢迎,目录标签
private JLabel welcomeLabel, catalogLabel;
private DefaultListModel listModel;
//统计处于列表
private JList statusArea;
//目录文本框
private JTextField catalogField;
//打开文件,统计,重置,退出等按钮
private JButton explorBtn, statusBtn, resetBtn, exitBtn;
//文件选择器
private JFileChooser chooser = new JFileChooser();
//统计标记
private boolean isAlreadyStat = false;
// 判断是否属于"/* */注释"
private boolean isExplainStatus = false;
//行数数列
private int[] count;
//存储代码总行数值
private int totalCount = 0;
//存储单个文件行数值
private int codeCount = 0;
//存储注释总行数值
private int explainCount = 0;
//存储空行总行数值
private int spaceCount = 0;
private InputStream input = null;
private BufferedReader br = null;
public CodeLineCounter(String title) {
super(title);
//设置大小和显示位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setBounds((screenSize.width - 505)/2, (screenSize.height - 379)/2, 505, 379);
//设置布局
this.setLayout(new BorderLayout());
//创建顶层容器
topPanel = new JPanel();
this.add(topPanel, BorderLayout.NORTH);
//创建欢迎标签
welcomeLabel = new JLabel();
welcomeLabel.setForeground(Color.RED);
String space = " " + " ";
welcomeLabel.setText(" 欢迎您使用Java版源代码行数计数器!" + space);
topPanel.add(welcomeLabel);
//创建统计区域列表
listModel = new DefaultListModel();
for(int i = 0;i < 15;i++)
listModel.addElement(" ");
statusArea = new JList(listModel);
statusArea.setSelectionBackground(Color.WHITE);
statusArea.setSelectionForeground(Color.BLACK);
this.add(statusArea, BorderLayout.CENTER);
//创建底部容器
bottomPanel = new JPanel();
bottomPanel.setLayout(new GridLayout(3, 1));
this.add(bottomPanel, BorderLayout.SOUTH);
panel = new JPanel();
bottomPanel.add(panel);
//创建目录标签
catalogLabel = new JLabel("源代码路径:");
panel.add(catalogLabel);
//创建目录文本框
catalogField = new JTextField(50);
panel.add(catalogField);
//打开文件按钮
explorBtn = new JButton("打开文件...");
explorBtn.addActionListener(new ButtonActionListener());
panel.add(explorBtn);
panel = new JPanel();
bottomPanel.add(panel);
panel.add(new JLabel("※※※※※★★★★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★★★★★※※※※※"));
panel = new JPanel();
bottomPanel.add(panel);
//创建统计按钮
statusBtn = new JButton("统计");
statusBtn.addActionListener(new ButtonActionListener());
panel.add(statusBtn);
//占位标签
panel.add(new JLabel(" "));
//创建重置按钮
resetBtn = new JButton("重置");
resetBtn.addActionListener(new ButtonActionListener());
panel.add(resetBtn);
//占位标签
panel.add(new JLabel(" "));
//创建退出按钮
exitBtn = new JButton("退出");
exitBtn.addActionListener(new ButtonActionListener());
panel.add(exitBtn);
}
/**
* 注册按钮监听事件
*/
class ButtonActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getSource() == explorBtn) {
chooser.setDialogTitle("打开");
CodeLineCounter.fileFilter(chooser);
chooser.showOpenDialog(null);
File file = chooser.getSelectedFile();
if(file != null) {
isAlreadyStat = false;
String type = chooser.getName(file).substring(chooser.getName(file).indexOf(".") + 1).toLowerCase();
//System.out.println(type);
if(type != null && (type.equals("java") || type.equals("c") || type.equals("cpp"))) {
catalogField.setText(file.getAbsolutePath());
} else {
String[] msg = {"类型错误!!!!!!", "统计类型为‘java’,‘c’,‘cpp’。"};
JOptionPane.showMessageDialog(null, msg, "友情提示", JOptionPane.INFORMATION_MESSAGE);
}
}
} else if(e.getSource() == statusBtn) {
if(!isAlreadyStat) {
File file = chooser.getSelectedFile();
if(file != null) {
String name = chooser.getName(file);
String type = name.substring(name.indexOf(".") + 1).toLowerCase();
System.out.println(type);
System.out.println(statusArea.getSize().width);
int[] countArray = getLineCount(chooser);
listModel.add(1, "正在获取文件类型...");
listModel.add(2, " 统计文件类型:" + type + "文件");
listModel.add(4, "正在获取文件名称...");
listModel.add(5, " 统计文件名称:" + name);
listModel.add(8, "正在统计源代码行数...");
listModel.add(9, " 程序行数:※※※※※ <" + countArray[1] + "行> ※※※※※");
listModel.add(10, " 注释行数:※※※※※ <" + countArray[2] + "行> ※※※※※");
listModel.add(11, " 空行行数:※※※※※ <" + countArray[3] + "行> ※※※※※");
listModel.add(13, " 总 行 数:<" + countArray[0] + "行>");
isAlreadyStat = true;
} else {
JOptionPane.showMessageDialog(null, " 请选择要统计的源代码。", "友情提示", JOptionPane.INFORMATION_MESSAGE);
}
}
} else if(e.getSource() == resetBtn) {
for(int i = 0;i < 15;i++)
listModel.add(i, " ");
catalogField.setText("");
//isAlreadyStat = false;
} else if(e.getSource() == exitBtn) {
System.exit(0);
}
}
}
/**
* 过滤器
*/
private static void fileFilter(JFileChooser chooser) {
chooser.setAcceptAllFileFilterUsed(false);
chooser.setFileFilter(new FileFilter() {
public boolean accept(File f) {
return ((f.getName().endsWith(".java")) || (f.isDirectory()));
}
public String getDescription() {
return "Java源程序(*.java)";
}
});
chooser.setFileFilter(new FileFilter() {
public boolean accept(File f) {
return ((f.getName().endsWith(".c")) || (f.isDirectory()));
}
public String getDescription() {
return "C源程序(*.c)";
}
});
chooser.setFileFilter(new FileFilter() {
public boolean accept(File f) {
return ((f.getName().endsWith(".cpp")) || (f.isDirectory()));
}
public String getDescription() {
return "C++源程序(*.cpp)";
}
});
chooser.addChoosableFileFilter(new FileFilter() {
public boolean accept(File f) {
return true;
}
public String getDescription() {
return "所有文件(*.*)";
}
});
}
/**
* @param chooser
* 获取行数
*/
public int[] getLineCount(JFileChooser chooser) {
count = new int[4];
try {
input = new FileInputStream(chooser.getSelectedFile());
br = new BufferedReader(new InputStreamReader(input));
String lineValue = br.readLine();
while(lineValue != null) {
codeCount++;
//对两种不同类型注释分别处理,对空行用空字符串来判断
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 = codeCount + explainCount + spaceCount;
count[0]= totalCount;
count[1]= codeCount;
count[2]= explainCount;
count[3]= spaceCount;
br.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return count;
}
/**
* @param args
*/
public static void main(String[] args) {
//设置感官
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
CodeLineCounter counter = new CodeLineCounter("源代码行数计数器 v1.0");
counter.pack();
counter.setResizable(false);
counter.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
counter.setVisible(true);
}
}
- CodeLineCounter.rar (424.3 KB)
- 下载次数: 10
相关推荐
源代码行数统计器 1.5 本软件用于统计软件工程源代码行数,可对指定的子目录下或整个目录树中所有指定类型的源代码文件进行行数统计。 本软件的统计结果包含源代码中的注释行和空行,因为作者认为它们同样也是源...
源代码行数统计器是一种工具,它用于自动化计算编程项目中的源代码行数。这个工具对程序员来说非常有用,因为它可以快速提供项目规模的量化指标,帮助他们了解项目的复杂度和工作量。在软件开发中,代码行数常被用作...
源代码行数统计器 源代码行数统计器 作者:庄渭峰 版本:V1.5 类型:免费软件 功能简介: 本软件用于统计软件工程源代码行数,可对指定的子目录下或整个目录树中 所有指定类型的源代码文件进行行数统计。 本软件...
标题中的“java写的源代码行数统计器”指的是一个用Java编程语言开发的工具,它的主要功能是计算源代码文件中的行数。在软件开发中,行数统计有时被用作衡量项目规模或工作量的一个指标,尽管这并不是非常精确,但对...
源代码行数统计器 作者:庄渭峰 版本:V1.5 类型:免费软件 功能简介: 本软件用于统计软件工程源代码行数,可对指定的子目录下或整个目录树中 所有指定类型的源代码文件进行行数统计。 本软件的统计结果包含源...
Java编写的源代码行数统计器是一款用于计算项目中源代码行数的工具,它具有用户友好的界面和高精度的统计能力。该工具的主要功能是帮助开发者或团队管理者快速了解项目的规模,评估代码复杂性,以及跟踪项目的发展...
"万能源代码行数统计器"是一款专为软件开发者设计的实用工具,旨在高效地统计各种编程语言的源代码行数。它支持的语言包括但不限于C/C++、VB(Visual Basic)、C#、Java以及Delphi,同时也能处理纯文本文件(txt)和...
"源代码行数统计器1.5"是一个实用的小工具,专为程序员设计,用于量化他们的编程工作量。这个工具能够统计多种类型的源代码文件,包括C语言(*.c)、C++(*.cpp)、头文件(*.h)以及Progress 4GL(*.pbl)的代码...
源代码行数统计器.exe 文件类型:应用程序 描述:CodeLineCounter Microsoft 基础类应用程序 大小:204 KB (208,904 字节)
源代码行数统计器是一款专为开发者设计的实用工具,其主要功能是快速、准确地统计各类编程语言的源代码行数。这个压缩包“源代码行数统计器.zip”包含了一个名为“CodeLineCounter.exe”的可执行文件,这表明它是一...
源代码行数统计器是一种工具,它用于计算编程项目中包含的源代码行数。这种统计可以帮助开发者了解项目的规模,评估工作量,进行代码审查,甚至在一定程度上预测项目的复杂性和维护成本。以下是对给定的三个源代码...
源代码行数统计器 v1.5 本程序主要用于统计软件工程源代码行数,支持Unix/Linux环境。可对指定目录下所有指定类型的源代码文件进行行数统计。如上图所示,以行为单位,列出每个文件的源代码行数,可能大家还不经常用...
一款源代码行数统计工具,可统计指定文件类型的代码行数,包括C、C++、C#、VB、汇编等。
本软件用于统计软件工程源代码行数,可对指定的子目录下或整个目录树中所有指定类型的源代码文件进行行数统计,也可以同时统计指定的文件。 本软件的统计结果包含源代码中的注释行和空行,因为作者认为它们同样也...
一个简单的源代码行数统计器: 选择项目所在的文夹——选择文件类型——排除掉一些不希望统计的文件(比如VS自动生成的代码)——计算行数。。。 有效代码行数=总的行数 - 空格行 - 注释行 支持多级目录 修改...