题目

Java课程的综合实验…大三的时候写过的,不过现在回头看,发现写得真烂,所以在学习Java过程中重构了代码.

基本不算重构而是重写…改的时候差点看不懂自己写过什么…好了言归正传:
实验的要求如下:
一、题目:综合性实验 Java源代码分析程序
二、类型:综合型、探索型
三、目的:初步掌握运用面向对象方法编写应用程序,掌握类、对象、封装等;了解并应用Java语言的字符串处理、文本文件的读写
四、内容:
1.背景描述:
(1)Java语言共有50个关键字。
(2)Java源程序是以“.java”为扩展名的文本文件。
(3)可以考虑在Java源程序中的行共有3种:
代码行,可运行的Java源代码。例如:
int n = 10;
注释行,3种注释均可。例如:
/**
文档注释
*/

/*
多行注释
/
//单行注释
空行,既无代码,也无注释;
(4)特殊行的处理方法
如果有以下行尾单行注释的情况,将该行判定为代码行。
int number; //number表示人数
int n; /
n表示数量/
如果有以下行尾多行注释的情况,第1行判定为代码行,第二行判定为注释行。
int number; / number为整型
表示人数 */
假设被分析程序源码无其他特殊情况,如:
int /人数/ number;
2. 项目名和类名为JavaCodeAnalyzer,主类名等其他类名自行定义。

  1. 实现功能:
    (1) 程序运行时要求输入一个目录的名称。目录不存在或不是目录要提示错误并重新输入。
    (2) 找出输入目录中所有的Java源程序文件(文件扩展名为“.java”), 并进行源程序文件进行分析。
    需要分析的结果有:
    目录中源程序文件个数
    所有源程序文件总的字节数
    所有源程序文件中代码行数、注释行数、空行数及总行数。说明:行以回车结束。
    (3) 统计并按从多到少输出所有源程序文件中使用的Java关键字及其出现次数。
    (4) 统计分析的结果除在屏幕显示外,还需要存储到一个文本文件中,文件内容应该如下:

    目录名称:XXXXX(绝对路径方式)
    共有源程序文件XX个,总的大小为:XXXXXX 字节
    源程序文件总行数:xxxx,其中:
    代码行数:xxx,占xx.xx%
    注释行数:xxx,占xx.xx%
    空白行数:xxx,占xx.xx%

    源程序文件中使用过的关键字有(按使用次数降序排列):
    关键字1:xx次
    关键字2:xx次
    关键字3:xx次
    关键字4:xx次
    关键字5:xx次

本次分析时间:年-月-日,时-分-秒
注意:统计关键字使用次数时,要排除注释中出现的关键字和字符串直接量中出现的关键字。
好了,总的来说可以分成以下几个模块:
1.判断输入目录是否正确
2.搜索Java文件并保存到ArrayList
3.计算Java文件个数和总大小
4.统计源文件的代码行数,注释行数等
5.统计源文件的关键字出现次数
6.将输出结果保存到文件
7.输出计算用时
其中
2,3可以参考我的文章 [Java]统计指定目录中文件的个数和总的大小
4可以参考[Java]统计Java源文件代码行数,注释行数,空白行数
5可以参考 [Java]统计目录下Java源文件的关键字出现次数

代码实现

※重构代码中对6,7不做实现

1.判断输入目录是否正确

    public static String getPathName() {System.out.println("输入目录路径:");Scanner keyboardInput = new Scanner(System.in);String pathName = null;File root = null;while (true) {pathName = keyboardInput.nextLine();root = new File(pathName);if (root.isFile()) {System.out.println("输入不是目录,请重新输入");} else if (!root.exists()) {System.out.println("目录不存在,请重新输入");} else {break;}}return pathName;}

2.搜索Java文件并保存到ArrayList

    public void searchFiles() {File[] files = root.listFiles();int length = files.length;for (int i = 0; i < length; i++) {if (files[i].isDirectory()) {root = files[i];searchFiles();} else {if (files[i].getName().endsWith(".java"))fileList.add(files[i]);}}}

3.计算Java文件个数和总大小

    public void countFiles() {long totalSize = 0;System.out.println("目录名称:" + fileList.get(0).getParent());System.out.println("文件数:" + fileList.size());for (int i = 0; i < fileList.size(); i++) {totalSize += fileList.get(i).length();}System.out.println("文件总大小(bytes):" + totalSize);}

4.统计源文件的代码行数,注释行数等

代码与我的文章[Java]统计Java源文件代码行数,注释行数,空白行数一致.这里仅贴代码,详细解析请参考文章

import java.io.*;
import java.util.ArrayList;
import java.text.DecimalFormat;public class CodeAnalyzer {public void codeAnalyze(ArrayList<File> fileList) {double rowsCount = 0;double commentsCount = 0;double blanksCount = 0;double codesCount = 0;DecimalFormat df = new DecimalFormat("#.##");for (File file : fileList) {try {rowsCount += countRows(file);blanksCount += countBlanks(file);commentsCount += countComments(file);codesCount = rowsCount - blanksCount - commentsCount;} catch (IOException e) {e.printStackTrace();}}//输出结果System.out.println("源程序文件总行数:" + (int) rowsCount);System.out.println("代码行数:" + (int) codesCount + ",占" + df.format(codesCount / rowsCount * 100) + "%");System.out.println("注释行数:" + (int) commentsCount + ",占" + df.format(commentsCount / rowsCount * 100) + "%");System.out.println("空白行数:" + (int) blanksCount + ",占" + df.format(blanksCount / rowsCount * 100) + "%");}public int countRows(File file) throws IOException {BufferedReader input = new BufferedReader(new FileReader(file));int rows = 0;while (input.readLine() != null) {rows++;}return rows;}public int countBlanks(File file) throws IOException {BufferedReader input = new BufferedReader(new FileReader(file));int blanks = 0;String line = null;while ((line = input.readLine()) != null) {if (line.trim().equals("")) blanks++;}return blanks;}public int countComments(File file) throws IOException {BufferedReader input = new BufferedReader(new FileReader(file));int comments = 0;String line = null;while ((line = input.readLine()) != null) {line = line.trim();if (line.startsWith("//")) {//单行注释comments++;} else if (line.startsWith("/*")) { //多行及文档注释comments++;while (!line.endsWith("*/")) {line = input.readLine().trim();comments++;}} else if (line.contains("/*")) { //下行尾多行注释line = input.readLine().trim();if (line.endsWith("*/")) comments++;}}return comments;}}

5.统计源文件的关键字出现次数

与4一样,这里仅贴代码,详情解析到-> [Java]统计目录下Java源文件的关键字出现次数

import java.io.*;
import java.util.*;public class KeywordsAnalyzer {Map keywords;final String[] KEYWORDS = { //50个关键字"abstract", "assert", "boolean", "break", "byte","case", "catch", "char", "class", "const","continue", "default", "do", "double", "else","enum", "extends", "final", "finally", "float","for", "goto", "if", "implements", "import","instanceof", "int", "interface", "long", "native","new", "package", "private", "protected", "public","return", "strictfp", "short", "static", "super","switch", "synchronized", "this", "throw", "throws","transient", "try", "void", "volatile", "while"};public KeywordsAnalyzer() {keywords = new HashMap();for (String word : KEYWORDS) {keywords.put(word, 0);}}public void keywordsAnalyze(ArrayList<File> fileList) {for (File file : fileList) {try {countKeyWords(file);} catch (IOException e) {e.printStackTrace();}}//排序并输出结果List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(keywords.entrySet());Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {@Overridepublic int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {return o2.getValue().compareTo(o1.getValue());}});int count = 0;System.out.println("\n源程序文件中使用过的关键字有(按使用次数降序排列):");for(int i=0;i<5;i++){System.out.println("关键字 "+list.get(i).getKey()+": "+list.get(i).getValue()+"次");}}public void countKeyWords(File file) throws IOException {BufferedReader input = new BufferedReader(new FileReader(file));String line = null;while ((line = input.readLine()) != null) {line = line.trim();if (line.startsWith("//")) continue; //不处理单行注释else if (line.contains("/*")) { //多行,文档与尾行注释if (!line.startsWith("/*")) matchKeywords(line);//第一行算代码,其余算注释while (!line.endsWith("*/")) {line = input.readLine().trim();}}matchKeywords(line); //对代码行进行统计}}public void matchKeywords(String line) {String[] wordList = line.replaceAll("\\W", " ").split(" ");for (int i = 0; i < wordList.length; i++) {for (int j = 0; j < 50; j++) {if (wordList[i].equals(KEYWORDS[j])) {int count = (int) keywords.get(KEYWORDS[j]);keywords.put(KEYWORDS[j], count + 1);}}}}
}

测试结果

测试Timer.java,得到结果:

Java 综合性实验 Java源代码分析程序相关推荐

  1. Java综合性实验 - 学生成绩分析程序

    简要的需求分析 已经提供的数据: <1> 班级学生名单:学生的学号和姓名已经分别存储在以学生所在班级命名的文本文件中,每行存储一个学生的学号和姓名,中间用一个空格分隔.例如:2010级网络 ...

  2. 写一个java的网络数据包分析程序(一)

    需要写一个工具监控我所负责项目中的服务器与客户端的交易事件,而我又不方便修改系统代码(因为此工具只是我自己为了工作方便而作),因此需要通过监听并分析网络数据包来获取信息. 原本打算将tcpdump的C ...

  3. SCAU 2022 Java综合性实验

    目录 实验要求 思路讲解 程序类图 代码实现 代码以及测试目录下载 如果你觉得这篇文章帮到你的话,可以点个赞,这是对作者最好的鼓励 实验要求 一.实验目的 1.掌握面向对象程序设计的基本方法 2.应用 ...

  4. 基于java的学生考试成绩分析程序

    一.系统分析 本次试验需要编写一个学生考试成绩分析程序,至少具有这些功能:基本数据输入,能够建立并且输入班级.学生.课程和成绩单的信息,指定特定的班级和课程后,能够输出该班的所有学生的成绩,通过这个方 ...

  5. JAVA综合性实验——猜姓氏游戏

    假设游戏者共有十人,且有10个不同的姓:张.王.李.赵.刘.于.许.金.钱.孙,魔术师将十个姓写在四张纸牌上,游戏者只需指出那几张纸上有自己的姓,魔术师就能准确的说出游戏者的姓,如图所示. 请编程实现 ...

  6. C++|Java混合实验-java搭建get方法靶场,Qt发送请求获取数据

    目录 背景 演示 java web源码 Qt端源码 背景 因为最近想进一步学习http协议,想从QNetworkAccessManager中,但访问其他网站获取的数据,太过于复杂,不便于个人的实验,在 ...

  7. C++|Java混合实验-java搭建post方法靶场,Qt发送请求获取数据

    目录 背景 演示 Java web源码 Qt源码 背景 post方法使用的地方有多,比如各个Http的API,涉及上传文件等,都是要使用post上传,在此模拟下post的表单上传数据的方式. 演示 首 ...

  8. 实验四 lr0分析程序的设计与实现_试验机海外直播丨实现高精度CAE分析实验的材料评价案例技术介绍...

    什么是复合材料? 复合材料是指由两种或两种以上具有不同物理.化学性质的材料,以微观.细观或宏观等不同的结构尺度与层次,经过复杂的空间组合而形成的一个材料系统.复合材料具有高比强度和高比刚度,可设计性强 ...

  9. 计算机仿真实验结果的评价与分析,基于问卷调查法的计算机仿真技术课程综合性实验效果分析评价...

    摘要:综合性实验对于提高学生综合素质,培养学生实践能力与创新精神具有极其重要的作用,为了科学评价计算机仿真技术课程综合性实验效果,文章基于问卷调查法,阐述如何设计情况调查表,如何采用多种评价方法对学生 ...

  10. binlog流程 mysql_MySQL binlog分析程序:Open Replicator

    第0章:简介 (1)下面是http://code.google.com中的binlog事件分析结构图: (2)获取开源包的maven坐标 com.google.code open-replicator ...

最新文章

  1. Linux-NFS原理介绍
  2. delphi cxgrid读取本地image_技术讨论 | PHP本地文件包含漏洞GetShell
  3. C语言实现冒泡排序(bubble排序)算法(附完整源码)
  4. 内存管理:_CrtDumpMemoryLeaks和_CrtSetBreakAlloc
  5. java file rename 失败_java重命名文件造成文件不可读写
  6. 数据分析 数据清理_数据清理| 数据科学
  7. Elasticsearch安装X-Pack插件
  8. 思维导图 源码 php,使用思维导图,优雅的完成自己的代码
  9. day22:更换yum源及源码包安装
  10. windows mac linux 木马,针对Linux Windows macOS系统Adwind木马广告攻击
  11. iOS 友盟分享总结
  12. js正则表达式验证省份证信息
  13. matlab实现卷积编码与viterbi译码
  14. 老游戏《皇帝龙之崛起》修改最大建筑数到8000
  15. 2022年国内私网IP地址
  16. Web设计中的中国传统色彩速查表
  17. 思维导图之《一位股票投资家的良知:我为何放弃技术分析》
  18. strtol函数的用法
  19. 商标买卖哪个平台最好_商标买卖网站哪个靠谱?
  20. 硕盟SM-T67十合一拓展坞体验

热门文章

  1. Python教学视频(六)关系及逻辑运算
  2. 安装Selenium+Firefox+Firepath+Firebug
  3. 2021 年百度之星·程序设计大赛 - 初赛一
  4. 【论文精读】TransE 及其实现
  5. linux64 gaussian 16,Gaussian 16 运行与硬件配置参考
  6. 计算机专业建设委员会会议记录,第一次专业建设工作会议纪要
  7. [C#]使用EasyHook注入ws2_32.dll,实现send和recv拦截数据封包
  8. 第一时间---Windows 7 with SP1中英文原版MSDN下载汇总---原汁原味
  9. 学生时代的经历,利用Python在机房杀红蜘蛛,脱离老师控制!
  10. Python爬虫实战(2) 爬取中国土壤数据库部分数据