`

统计java源代码行数——coding篇

    博客分类:
  • Java
阅读更多

-----------------------------------------------------------------------

转自: http://fanyang219.iteye.com/blog/186968

-----------------------------------------------------------------------

 

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);
	}
}

 

分享到:
评论

相关推荐

    python统计指定目录内文件的代码行数

    python统计指定目录内文件的代码行数,程序实现统计指定目录内各个python文件的代码总行数,注释行数,空行数,并算出所占百分比 这符合一些公司的小需求,实际代码量的统计工作 效果如图 代码如下: #coding:...

    iOS游戏应用源代码——cammsaul-NAMenu-d4974a0.zip

    《iOS游戏应用源代码分析——cammsaul-NAMenu-d4974a0》 在iOS开发领域,源代码是理解应用运行机制的关键。"cammsaul-NAMenu-d4974a0.zip"这个压缩包包含了iOS游戏应用"cammsaul-NAMenu"的源代码,为开发者提供了一...

    iOS游戏应用源代码——waldo-ScoreFiveHundred-1.2-0-ge02ca4c.zip

    《iOS游戏应用源代码分析——waldo-ScoreFiveHundred》 在iOS开发领域,源代码是理解应用程序工作原理和学习技术的关键。本篇将详细探讨"waldo-ScoreFiveHundred-1.2-0-ge02ca4c.zip"这个压缩包中的iOS游戏应用源...

    H.264源代码—— x264代码

    《深入剖析H.264编码技术:以x264源代码为例》 H.264,全称为Advanced Video Coding(高级视频编码),是国际电信联盟(ITU-T)和国际标准化组织(ISO)联合制定的一套视频编码标准,其在数字视频编码领域具有深远...

    iOS游戏应用源代码——lolohouse-TextStepperField-a98518f.zip

    【iOS游戏应用源代码——lolohouse-TextStepperField-a98518f.zip】这个压缩包文件主要涉及的是iOS开发中的一个特定组件——TextStepperField,这是一个自定义UI控件,用于增强标准的UITextField功能,使得用户可以...

    阿里巴巴 Java 编码指南,Alibaba Java Coding Guidelines​,兼容 Idea 2023.3+

    《阿里巴巴 Java 编码指南》是业界广泛采用的编码规范,旨在提高代码质量和开发效率,尤其对于使用 IntelliJ IDEA 的开发者来说,此指南的兼容性更新至 2023.3+ 版本,确保了最新的开发环境支持。这份指南在 2024 年...

    iOS游戏应用源代码——jasarien-JSTokenField-1.0-17-gc712902.zip

    《iOS游戏应用源代码解析——jasarien-JSTokenField-1.0-17-gc712902》 iOS游戏开发是移动应用领域的一个重要分支,其复杂性和创新性吸引了无数开发者投身其中。jasarien-JSTokenField-1.0-17-gc712902.zip是一个...

    Coding-iPad, Coding iPad 客户端源代码.zip

    首先,我们来看看项目的核心组件——代码编辑器。在iPad上构建一个高效且功能完备的代码编辑器并非易事,因为它需要处理多点触控输入、语法高亮、代码自动完成、括号匹配等功能。这通常涉及到对TextKit或CoreText...

    JAVA社区网络服务系统(源代码+毕业设计文章)

    JAVA社区网络服务系统(源代码+毕业设计文章)JAVA社区网络服务系统(源代码+毕业设计文章)JAVA社区网络服务系统(源代码+毕业设计文章)JAVA社区网络服务系统(源代码+毕业设计文章)JAVA社区网络服务系统(源代码+毕业...

    Eclipse Rich Client Platform Designing Coding and Packaging Java Applications 源代码

    这个源代码包涵盖了设计、编码和打包基于Eclipse RCP的Java应用的关键知识点,对于深入理解Eclipse RCP的工作原理和开发流程极具价值。 1. **Eclipse RCP介绍**:Eclipse RCP 是一个开放源码的开发平台,它提供了...

    Java代码实现的在线购物系统的设计与实现(源代码+系统+WORD论文)

    基于Java的在线购物系统的设计与实现(源代码+系统+WORD论文) Java代码实现的在线购物系统的设计与实现(源代码+系统+WORD论文) Java代码实现的在线购物系统的设计与实现(源代码+系统+WORD论文) Java代码实现的...

    Alibaba Java Coding GuidelinesIDEA插件

    总结来说,Alibaba Java Coding Guidelines IDEA插件是提升Java开发效率和代码质量的得力助手。它通过集成编码规范,让开发者在编码过程中就能实现错误预防,促进了代码的标准化,从而提高了团队协作的效率。无论你...

    Java游戏设计打飞机程序(源代码+WORD论文)

    Java游戏设计打飞机程序(源代码+WORD论文) Java游戏设计打飞机程序(源代码+WORD论文) Java游戏设计打飞机程序(源代码+WORD论文) Java游戏设计打飞机程序(源代码+WORD论文) Java游戏设计打飞机程序(源代码+WORD论文) ...

    java 编码规范(java Coding Standards)

    Java编程语言以其强大的功能、平台独立性和丰富的库而广受欢迎,但为了确保代码的质量和可维护性,遵循一套良好的编码规范至关重要。这份“Java编码规范”手册提供了指导原则,帮助开发者编写整洁、一致且易于理解的...

    Game+Coding+Complete示例源代码

    《Game Coding Complete》是一本备受推崇的游戏开发指南,旨在帮助开发者深入理解...总的来说,《Game Coding Complete》的示例源代码是一个宝贵的资源,对于想要提升游戏编程技能的人来说,无疑是一份珍贵的学习资料。

    最新版Alibaba_Java_Coding_Guidelines-2.0.2.zip离线包

    总的来说,《Alibaba Java Coding Guidelines》2.0.2版提供了一个全面且实用的Java编程标准,它不仅有助于提升代码质量,也有助于培养良好的编程习惯。开发者可以将其集成到IDEA中,进行实时的代码检查,以达到规范...

    swift-CodingiOS客户端源代码

    《Swift编程:深入解析Coding iOS客户端源代码》 在移动应用开发领域,Swift语言以其简洁、安全和高效的特点,成为了iOS开发的首选工具。本文将深入探讨“Coding iOS客户端源代码”,通过分析这个完整的Swift项目,...

    Alibaba Java Coding Guidelines

    Alibaba Java Coding GuidelinesAlibaba Java Coding GuidelinesAlibaba Java Coding GuidelinesAlibaba Java Coding Guidelines

    Alibaba-Java-Coding-Guidelines-2.1.1

    Alibaba_Java_Coding_Guidelines-2.1.1 是阿里巴巴集团发布的Java编程规范的一个版本。这个规范旨在统一阿里巴巴集团内部Java开发者的编码习惯,提升代码的可读性、可维护性和性能。 该规范通常包含多个方面,如...

    java数据结构(含源代码)

    这个压缩包包含了一系列Java实现的数据结构源代码,旨在帮助开发者提升对数据结构的理解和实践能力。 1. **BST.java**:二叉搜索树(Binary Search Tree,BST)是一种自平衡的二叉树,其中每个节点的值都大于其左...

Global site tag (gtag.js) - Google Analytics