题目类别: 实验
关键字: 类、对象、封装、类之间的关系、字符串、文本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);
}
}
测试结果如下: