华南农业大学Java综合性实验 Java源程序分析程序

综合性实验:Java源程序分析程序
题目关键字综合性实验
题目内容

综合性实验:Java源程序分析程序

一、实验目的

1.掌握面向对象程序设计的基本方法

2.应用Java语言编写应用程序

 

二、实验要求:

1. 编写一个Java应用程序,实现对某个目录中的所有Java源程序文件(包含该目录的子目录中的源程序文件)进行统计。统计内容包括:

(1) 目录中每个源程序文件的总行数和空白行数,文件的字节数;

(2) 目录中所有源程序文件合计总行数、合计空白行数、合计文件的字节数。

 

2. 具体实现要求如下:

(1) 程序运行首先显示如下所示的菜单:

 

5d0a368af86bbc4c993d9e4985962686.png

 

(2) 选择菜单中第1项时,要求输入一个目录名

如果输入目录名称对应的目录不存在或不是目录,则输出:

[目录名称] 不是合法的目录名称!

例如:

 

637ef2db75596b4d0ca310bcfc32ea85.png

 

如果是合法存在的目录,则对该目录中的Java源程序文件进行分析,分析内容包括:

细节部分:每个源程序文件的行数、其中空行数、字节数。

合计部分:源程序文件个数、源程序文件行数、其中空行数、总的字节数。

注意,分析时包括输入目录中的所有子目录。

 

分析的结果的保存要求:

在当前项目目录中建立一个名为result的目录,结果文件存放在该目录中。

结果文件是一个文本文件,命名方式是用被分析的目录名作为主文件名,扩展名为目录名。

例如:分析D:demo目录,结果文件名为“demo.txt”。

结果文件中数据存放格式如下示例:

 

dc6637c6d6fe74bb2c7d1c7c34e2176d.png

其中,

第1行:被分析目录的完整名称

第2行:空行

第3行:Files detail:

第4行:被分析目录的短名称,前面有一个 + 号

第5行:从本行开始依次输出被分析目录中的子目录和源程序文件

如果是子目录,则该行是 + 号 和 子目录的短名称

如果是源程序文件,则该行以 - 号开始,依次是:文件名、总行数、空白行数、字节数

注意:一个目录中如果既有子目录也有源程序文件,则先依次排列子目录,再依次排列文件。并且要按照名称升序排序。同时,每深入一层子目录,要缩进4个空格。

第X行:Total:

第X+1行:目录中总文件个数

第X+2行:目录中总的行数

第X+3行:目录中总的空白行数

第X+4行:目录中总字节数

 

(3) 选择菜单中第2项时,

如果result目录中还没有结果文件,则显示:还没有分析结果!

如果result目录中已经有结果文件,则以下面格式显示文件列表:

可以查看的结果文件有:

 

46a5faf8ba36770b5eb5c5d67955543c.png

输入文件编号后,显示结果文件,如果输入0表示不查看任何结果。编号输入错误应该提示。

 

3. 可以使用给定目录进行测试,例如:某目录分析的结果如下图:

 

342f1e275d7d1956b871ac4693b2a0f8.png

 

 

Main类:

package data;
import java.io.*;
public class Main {

    public static void main(String[] args) throws IOException {//主函数
        Menu.start();
    }
}

Finalresult类:

package data;
import java.io.*;
public class Finalresult {
    //
    protected static int total=0;
    protected static int blank=0;
    protected static int bytes=0;
    protected static int filenum=0;

    public static void inistresult(){//用于初始化统计结果
        Finalresult.blank=0;
        Finalresult.total=0;
        Finalresult.bytes=0;
        Finalresult.filenum=0;
    }

    public static void Outputtofile(File file){
        File root = new File("Result");//存放结果txt的目录
        root.mkdir();//创建Result文件夹
        File resultTxt = new File("Result\\"+file.getName() + ".txt");
        try {
            resultTxt.createNewFile();//生成保存 result 的文件
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            PrintStream put = new PrintStream(resultTxt);//将输出流定向到文件中
            System.setOut(put);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void Outputtopath(File file) throws IOException{
        PrintStream out = System.out;//保存控制台
        Finalresult.Outputtofile(file);
        System.out.println("[" + file.getAbsolutePath() + "]   Result:");
        System.out.println("");
        System.out.println("Files detail:");
        Finalresult.inistresult();
        Function.Openfiles(file, 0);//递归分析目录下的文件
        Print.print2();
        System.setOut(out);//定向输出到控制台
    }

}

Menu类:

package data;
import java.util.*;
import java.io.*;
public class Menu {//该类用于输出用户界面以及执行不同的操作

    public static final String JAVA = ".java";

    private static void menu0(){//输出初始菜单
        Print.print1();
    }

    public static  void start() throws IOException {//start方法负责运行整个程序
        int i=1;
        boolean t=true;
        Scanner cin = new Scanner(System.in);
        while (t) {
            Finalresult.inistresult();//统计结果初始化
            Menu.menu0();
            System.out.print("请选择: ");
            i = cin.nextInt();
            System.out.println("");
            switch (i) {//根据输入的值执行不同的功能
                case 1:
                    Menu.menu1();//执行功能1,分析目录中的源程序文件
                    break;
                case 2:
                    Menu.menu2();//执行功能2.查看分析结果
                    break;
                case 0://退出程序
                    System.out.println("Close!");
                    t=false;
                    break;
                default:
                    System.out.println("Error Input!");
                    break;
            }
        }
    }

    private static void menu1() throws IOException {
        boolean i = true;//控制循环
        Scanner cin = new Scanner(System.in);
        while (i) {
            System.out.print("请输入目录名称:");
            String path = cin.next();//获取目录名称
            File f = new File(path);
           //System.out.println("");
            if (f.exists()) {//如果目录存在
                Finalresult.Outputtopath(f);//调用结果输出方法进行分析和输出
                Finalresult.inistresult();
                System.out.println("[" + path + "]   Result:");
                System.out.println("");
                System.out.println("Files detail:");
                Function.Openfiles(f, 0);
                i=false;
            }
            else if (!f.exists()) {//如果目录不存在,再次输入
            System.out.println("错误:[" + path + "]不算目录名或不存在!");
            }
            if(!i) {
                Print.print2();//输出统计后的结果
            }
        }
    }

    private static void menu2() throws IOException {
        File root = new File("Result");//Result为存放分析结果的目录
        File[] files = root.listFiles();
        int i = 1;
        boolean t = true;
        Scanner cin = new Scanner(System.in);
        while (t) {
            if(files==null){//该目录不存在时跳出
                System.out.println("还没有分析结果!");
                t=false;
                break;
            }
            if (files.length == 0) {//该目录为空时跳出
                System.out.println("还没有分析结果!");
                t=false;
                break;
            } else {//打印用户选择界面
                t=false;
                System.out.println("--------------------------------");
                for (File f : files) {
                    System.out.println(i + "." + f.getName());
                    i++;
                }
                System.out.println("--------------------------------");
                System.out.println("选择要查看的结果文件(0表示放弃)");
            }
            int choice = cin.nextInt();//获取用户选择
            if (choice - 1 >= 0 && choice <= files.length) {
                Getresult g = new Getresult(files[choice - 1]);//创建结果查看类
                g.Readresult();//调用结果查看方法
            } else {
                System.out.println("非合法输入!");
            }
        }
     }
}

Function类:

package data;

import java.util.*;
import java.io.*;

public class Function {//该类用于实现程序的分析功能
    public static final String JAVA = ".java";

    public static void Openfiles(File f,int i) throws IOException{//递归获取目录中的所有文件和子目录
        File fi[] = f.listFiles();
        Function.sortFiles(fi);//对文件和目录进行排序
        for (File file : fi) {
            for(int j=0;j<i;j++){
                System.out.print("    ");
            }
            if(!file.isDirectory()&&file.toString().toLowerCase().endsWith(JAVA)) {
                //统计结果
                Finalresult.total+=Function.getTotal(file);
                Finalresult.blank+=Function.getBlank(file);
                Finalresult.bytes+=file.length();
                Finalresult.filenum++;
                //输出分析结果
                String name = String.format("%-25s",file.getName());
                System.out.printf("-%s",name);
                System.out.printf("Total:%7d",Function.getTotal(file));
                System.out.printf(",  Blank:%7d",Function.getBlank(file));
                System.out.printf(",  %7dBytes\n",file.length());
            }else if(file.toString().toLowerCase().endsWith(JAVA)||file.isDirectory()){
                System.out.println("+"+file.getName());
            }
            File file2[] = file.listFiles();
            if(file2!=null){
                Function.Openfiles(file,i+1);//递归
            }
        }
    }


    public static int getTotal(File f) throws IOException{
        int total=0;
        try {
            Scanner re = new Scanner(f);
            while (re.hasNextLine()){
                if(!"".equals(re.nextLine())){
                    total++;
                }
            }
            re.close();
        }catch (Exception e){
            e.getStackTrace();
        }
        return total;
    }

    public static int getBlank(File f) throws IOException{
        int blank=0;
        try {
            Scanner re = new Scanner(f);
            while (re.hasNextLine()){
                if("".equals(re.nextLine())){
                    blank++;
                }
            }
            re.close();
        }catch (Exception e){
            e.getStackTrace();
        }
        return blank;
    }

    public static void sortFiles(File[] files) {
        Arrays.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                if (o1.isFile() && o2.isFile()) {//同为文件,按字典序排序
                    return o1.getName().compareTo(o2.getName());
                } else if (o1.isDirectory() && o2.isDirectory()) {//同为目录,按字典序排序
                    return o1.getName().compareTo(o2.getName());
                } else if (o1.isDirectory() && o2.isFile()) {//目录“小于”文件,排在前面
                    return -1;
                } else if (o1.isFile() && o2.isDirectory()) {
                    return 1;
                } else {
                    return 0;
                }
            }
        });
    }
    
}

Getresult类:

package data;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Getresult {//结果读取类,用于读取Result中已经存在的结果文件
    private File file;

    public Getresult(File file) {
        this.file=file;
    }

    public void Readresult() throws IOException{//该方法用于读取文件中的内容
        try {
            Scanner re = new Scanner(file);
            while (re.hasNextLine()){
                System.out.println(re.nextLine());//按行读取
            }
            re.close();
        }catch (Exception e){
            e.getStackTrace();
        }
    }

}

Print类:(这个类可以拆掉插在别的类里)

package data;

public class Print {

    public static void print1(){//第一个菜单
        System.out.println("------------MENU------------");
        System.out.println("1.分析目录中的源程序文件");
        System.out.println("2.查看分析结果");
        System.out.println("0.退出程序");
        System.out.println("--------------------------------");
    }

    public static void print2(){//输出统计结果
        System.out.println("Total:");
        System.out.printf("\t%6d    Java Files\n",Finalresult.filenum);
        System.out.printf("\t%6d    lines in Files\n",Finalresult.total);
        System.out.printf("\t%6d    blank lines\n",Finalresult.blank);
        System.out.printf("\t%6d    bytes\n",Finalresult.bytes);
        System.out.println("");
    }
}

 

 

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mika的瑞士卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值