综合性实验:Java源程序分析程序 | |
题目关键字 | 综合性实验 |
题目内容 | 综合性实验:Java源程序分析程序 一、实验目的 1.掌握面向对象程序设计的基本方法 2.应用Java语言编写应用程序
二、实验要求: 1. 编写一个Java应用程序,实现对某个目录中的所有Java源程序文件(包含该目录的子目录中的源程序文件)进行统计。统计内容包括: (1) 目录中每个源程序文件的总行数和空白行数,文件的字节数; (2) 目录中所有源程序文件合计总行数、合计空白行数、合计文件的字节数。
2. 具体实现要求如下: (1) 程序运行首先显示如下所示的菜单:
(2) 选择菜单中第1项时,要求输入一个目录名 如果输入目录名称对应的目录不存在或不是目录,则输出: [目录名称] 不是合法的目录名称! 例如:
如果是合法存在的目录,则对该目录中的Java源程序文件进行分析,分析内容包括: 细节部分:每个源程序文件的行数、其中空行数、字节数。 合计部分:源程序文件个数、源程序文件行数、其中空行数、总的字节数。 注意,分析时包括输入目录中的所有子目录。
分析的结果的保存要求: 在当前项目目录中建立一个名为result的目录,结果文件存放在该目录中。 结果文件是一个文本文件,命名方式是用被分析的目录名作为主文件名,扩展名为目录名。 例如:分析D:demo目录,结果文件名为“demo.txt”。 结果文件中数据存放格式如下示例:
其中, 第1行:被分析目录的完整名称 第2行:空行 第3行:Files detail: 第4行:被分析目录的短名称,前面有一个 + 号 第5行:从本行开始依次输出被分析目录中的子目录和源程序文件 如果是子目录,则该行是 + 号 和 子目录的短名称 如果是源程序文件,则该行以 - 号开始,依次是:文件名、总行数、空白行数、字节数 注意:一个目录中如果既有子目录也有源程序文件,则先依次排列子目录,再依次排列文件。并且要按照名称升序排序。同时,每深入一层子目录,要缩进4个空格。 第X行:Total: 第X+1行:目录中总文件个数 第X+2行:目录中总的行数 第X+3行:目录中总的空白行数 第X+4行:目录中总字节数
(3) 选择菜单中第2项时, 如果result目录中还没有结果文件,则显示:还没有分析结果! 如果result目录中已经有结果文件,则以下面格式显示文件列表: 可以查看的结果文件有:
输入文件编号后,显示结果文件,如果输入0表示不查看任何结果。编号输入错误应该提示。
3. 可以使用给定目录进行测试,例如:某目录分析的结果如下图:
|
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("");
}
}