Java实验15 Java源程序分析程序

题目类别: 实验


关键字: 类、对象、封装、类之间的关系、字符串、文本IO、File


内容要求:

1 . 编写一个Java应用程序。


2 . 要求实现功能如下:

(1) 从键盘输入一个字符串,表示一个目录名称。

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

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

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

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

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

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

3 . 程序运行参见下图:
在这里插入图片描述
详细信息部分的输出要求:

   • 第1行是要分析的目录名;
   • 后面依次列出其中所有的内容,目录名前加“+”,Java文件前加“-”
   • 每深入一级子目录,输出向右缩进4个空格
   • 同一级目录下,先输出目录,再输出文件;目录和文件排列按名称升序排序。

上面的图的结果是由rmi.zip中的文件分析生成。


4 . 程序设计要求使用面向对象方法编写。

实现代码:

Main类:

package cn.zg.main;


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

import cn.zg.function.Function;

/**
 * @author zg
 */
public class Main {
    public static void main(String[] args) {
        System.out.print("请输入要统计的目录名:");
        Scanner sc = new Scanner(System.in);
        String dirString=sc.next();
        sc.close();
        File dir = new File(dirString);
        //  输入目录名称对应的目录不存在或不是目录
        if(!dir.exists()||!dir.isDirectory()){
            System.out.println("["+dir+"]"+"不是合法的目录名称!");
        }else{
            //  对该目录中的Java源程序文件进行分析
            Function.analyze(dir);
        }
    }
}

Function类:

package cn.zg.function;

import cn.zg.util.Print;

import java.io.File;

/**
 * @author zg
 */
public class Function {
    public static void analyze(File path){
        Print.show(path);
    }
}



Print类:

package cn.zg.util;

import java.io.File;
import java.util.Arrays;

/**
 * @author zg
 */
public class Print {

    /**
     * java文件后缀
     */
    private static final String JAVA_SUFFIX = ".java";

    /**
     *
     * @param dirPath 目录路径
     */
    public static void show(File dirPath){
        System.out.println("["+dirPath.getAbsolutePath()+"]"+"目录的分析结果:");
        System.out.printf("%-30s","源程序文件个数:");
        System.out.printf("%15d\n",Statistic.fileCounts(dirPath));
        System.out.printf("%-30s","源程序文件行数:");
        System.out.printf("%15d\n",Statistic.dirLines(dirPath));
        System.out.printf("%-30s","其中空行数:");
        System.out.printf("%16d\n",Statistic.dirBlank(dirPath));
        System.out.printf("%-30s","总的字节数:");
        System.out.printf("%16d\n",Statistic.dirBytes(dirPath));
        System.out.println("详细信息如下:");
        showDir(dirPath,"");
    }

    /**
     *
     * @param path 目录路径
     * @param str 缩进(格式)
     */
    private static void showDir(File path,String str){
        //  目录名前加"+"
        System.out.println(str+"+"+path.getName());
        final File[] files = path.listFiles((dir1,name)->
                new File(dir1,name).isDirectory()||name.toLowerCase().endsWith(JAVA_SUFFIX));
        //  同一级目录下,先输出目录,再输出文件;目录和文件排列按名称升序排序
        if (files != null) {
            Arrays.sort(files,(o1,o2)->{
                if(o1.isDirectory()&&o2.isDirectory()){
                    return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(),o2.getName());
                }
                if(o1.isDirectory()){
                    return -1;
                }
                if(o2.isDirectory()){
                    return 1;
                }
                return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(),o2.getName());
            });
        }
        if (files != null) {
            for (File f : files) {
                if(f.isFile()){
                    showFile(f.getAbsoluteFile(),str+"    ");
                }else{
                    showDir(f.getAbsoluteFile(),str+"    ");
                }
            }
        }
    }

    /**
     * 打印每个源程序文件的行数、其中空行数、字节数
     * @param filePath 文件路径
     * @param str 缩进(格式)
     */
    private static void showFile(File filePath,String str){
        //  Java文件前加"-"
        String name=str+"-"+filePath.getName();
        System.out.printf("%-40s", name);
        System.out.printf("%-7s","Total:");
        System.out.printf("%8d",Statistic.javaFileLines(filePath));
        System.out.printf("%-10s",", Blank:");
        System.out.printf("%8d",Statistic.javaFileBlank(filePath));
        System.out.print(", ");
        System.out.printf("%10d",Statistic.javaFileBytes(filePath));
        System.out.println(" Bytes");
    }

}



Statistic类:

package cn.zg.util;

import java.io.*;

/**
 * @author zg
 */
public class Statistic {

    /**
     * java文件后缀
     */
    private static final String JAVA_SUFFIX=".java";

    /**
     *
     * @param dirPath 目录路径名
     * @return 目录下的Java源程序文件个数
     */
    public static int fileCounts(File dirPath){
        int count=0;
        if(dirPath.isDirectory()){
            //  文件过滤器,过滤得到目录和Java文件
            File[] dir = dirPath.listFiles(((dir1, name) ->
                    new File(dir1,name).isDirectory()||name.toLowerCase().endsWith(JAVA_SUFFIX)));
            if(dir!=null){
                for (File f : dir) {
                    if(f.isDirectory()){
                        count+=fileCounts(f.getAbsoluteFile());
                    }else if(f.toString().toLowerCase().endsWith(JAVA_SUFFIX)){
                        count++;
                    }
                }
            }
        }else if(dirPath.toString().toLowerCase().endsWith(JAVA_SUFFIX)){
            count++;
        }
        return count;
    }

    /**
     *
     * @param filePath 文件路径名
     * @return 每个Java源程序文件的行数
     */
    public static long javaFileLines(File filePath){
        long count=0;
        try(final BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath))){
            while(bufferedReader.readLine()!=null){
                count++;
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return count;
    }

    /**
     *
     * @param dirPath 目录路径
     * @return 目录包含所有Java文件的总行数
     */
    public static long dirLines(File dirPath){
        long count=0;
        //  文件过滤器,过滤得到目录和Java文件
        final File[] files = dirPath.listFiles((dir1,name)->
                new File(dir1,name).isDirectory()||name.toLowerCase().endsWith(JAVA_SUFFIX));
        if (files != null) {
            for (File f : files) {
                if(f.isDirectory()){
                    count+=dirLines(f.getAbsoluteFile());
                }else{
                    count+=javaFileLines(f.getAbsoluteFile());
                }
            }
        }
        return count;
    }

    /**
     *
     * @param filePath 文件路径
     * @return Java文件中的字节数
     */
    public static long javaFileBytes(File filePath){
        long count=0;
        byte[] b=new byte[1024];
        try(final BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath))){
            long len;
            while((len=bufferedInputStream.read(b))!=-1){
                count+=len;
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return count;
    }

    /**
     *
     * @param dirPath 目录路径
     * @return  目录包含所有Java文件的总字节数
     */
    public static long dirBytes(File dirPath){
        long count=0;
        //  文件过滤器,过滤得到目录和Java文件
        final File[] files = dirPath.listFiles((dir1,name)->
                new File(dir1,name).isDirectory()||name.toLowerCase().endsWith(JAVA_SUFFIX));
        if(files!=null){
            for (File f : files) {
                if(f.isDirectory()){
                    count+=dirBytes(f.getAbsoluteFile());
                }else{
                    count+=javaFileBytes(f.getAbsoluteFile());
                }
            }
        }
        return count;
    }

    /**
     *
     * @param filePath 文件路径
     * @return 文件的空行数
     */
    public static long javaFileBlank(File filePath){
        long count=0;
        try(final BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath))){
            String str;
            while((str=bufferedReader.readLine())!=null){
                if(str.trim().length()<=0){
                    count++;
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return count;
    }

    /**
     *
     * @param dirPath 目录路径
     * @return 目录包含所有Java文件的总空行数
     */
    public static long dirBlank(File dirPath){
        long count=0;
        //  文件过滤器,过滤得到目录和Java文件
        final File[] files = dirPath.listFiles((dir1,name)->
                new File(dir1,name).isDirectory()||name.toLowerCase().endsWith(JAVA_SUFFIX));
        if(files!=null){
            for (File f : files) {
                if(f.isDirectory()){
                    count+=dirBlank(f.getAbsoluteFile());
                }else{
                    count+=javaFileBlank(f.getAbsoluteFile());
                }
            }
        }
        return count;
    }

}












下面是测试类(数据测试):

package cn.zg.test;

import cn.zg.function.Function;
import org.junit.Test;

import java.io.File;


/**
 * @author zg
 */

public class FunctionTest {
    @Test
    public void test(){
        final File file = new File("src");
        Function.analyze(file);
    }

}

测试结果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值