版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/81814077
继续做一个File类相关的递归练习题,需求是,键盘给定一个文件夹路径,按照层级打印该文件夹下文件和文件夹。
1. 分析
前面我们练习了很多次获取文件夹路径的方法,下面重点分析打印的思路。
* 1.获取所有文件夹和文件,存储在File数组中
* 2.遍历数组
* 3.无论是文件还是文件夹都需要打印
* 4.如果是文件夹,递归调用
2.打印初步代码实现
package io;
import java.io.File;
import java.util.Scanner;
public class Test8 {
/**
* 题目:把文件夹下文件和文件夹按层级打印(linux中树形打印)
* 分析
* @param args
* 1.获取所有文件夹和文件,存储在File数组中
* 2.遍历数组
* 3.无论是文件还是文件夹都需要打印
* 4.如果是文件夹,递归调用
*/
public static void main(String[] args) {
File dir = getDir();
printDir(dir);
}
public static void printDir(File dir) {
//1.获取所有文件夹和文件,存储在File数组中
File[] subFiles = dir.listFiles();
//2.遍历数组
for (File subfile : subFiles) {
//3.无论是文件还是文件夹都需要打印
System.out.println(subfile);
//4.如果是文件夹,递归调用
if(subfile.isDirectory()) {
printDir(subfile);
}
}
}
/**
* 获取文件夹路径
* @return
*/
public static File getDir () {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件路径。");
while(true) {
String line = sc.nextLine(); //键盘录入文件夹路径存储
File dir = new File(line); //封装file对象
//判断
if( !dir.exists()) {
System.out.println("你输入的文件夹路径不存在,请重新输入。");
}else if(dir.isFile()) {
System.out.println("你输入的是一个文件的路径,请换成文件夹路径");
}else {
return dir;
}
}
}
}
运行,给出本地maven地址,打印效果没有层级打印,但是打印出来了。
C:\apache-maven-3.5.0\bin
C:\apache-maven-3.5.0\bin\m2.conf
C:\apache-maven-3.5.0\bin\mvn
C:\apache-maven-3.5.0\bin\mvn.cmd
C:\apache-maven-3.5.0\bin\mvnDebug
C:\apache-maven-3.5.0\bin\mvnDebug.cmd
C:\apache-maven-3.5.0\bin\mvnyjp
C:\apache-maven-3.5.0\boot
C:\apache-maven-3.5.0\boot\plexus-classworlds-2.5.2.jar
C:\apache-maven-3.5.0\conf
C:\apache-maven-3.5.0\conf\logging
C:\apache-maven-3.5.0\conf\logging\simplelogger.properties
C:\apache-maven-3.5.0\conf\settings.xml
C:\apache-maven-3.5.0\conf\toolchains.xml
C:\apache-maven-3.5.0\lib
C:\apache-maven-3.5.0\lib\aopalliance-1.0.jar
C:\apache-maven-3.5.0\lib\cdi-api-1.0.jar
C:\apache-maven-3.5.0\lib\cdi-api.license
C:\apache-maven-3.5.0\lib\commons-cli-1.4.jar
C:\apache-maven-3.5.0\lib\commons-cli.license
C:\apache-maven-3.5.0\lib\commons-io-2.5.jar
C:\apache-maven-3.5.0\lib\commons-io.license
C:\apache-maven-3.5.0\lib\commons-lang3-3.5.jar
C:\apache-maven-3.5.0\lib\commons-lang3.license
C:\apache-maven-3.5.0\lib\ext
C:\apache-maven-3.5.0\lib\ext\README.txt
C:\apache-maven-3.5.0\lib\guava-20.0.jar
C:\apache-maven-3.5.0\lib\guice-4.0-no_aop.jar
C:\apache-maven-3.5.0\lib\jansi-1.13.jar
C:\apache-maven-3.5.0\lib\jansi-native
C:\apache-maven-3.5.0\lib\jansi-native\linux32
C:\apache-maven-3.5.0\lib\jansi-native\linux32\libjansi.so
C:\apache-maven-3.5.0\lib\jansi-native\linux64
C:\apache-maven-3.5.0\lib\jansi-native\linux64\libjansi.so
C:\apache-maven-3.5.0\lib\jansi-native\osx
C:\apache-maven-3.5.0\lib\jansi-native\osx\libjansi.jnilib
C:\apache-maven-3.5.0\lib\jansi-native\README.txt
C:\apache-maven-3.5.0\lib\jansi-native\windows32
C:\apache-maven-3.5.0\lib\jansi-native\windows32\jansi.dll
C:\apache-maven-3.5.0\lib\jansi-native\windows64
C:\apache-maven-3.5.0\lib\jansi-native\windows64\jansi.dll
C:\apache-maven-3.5.0\lib\javax.inject-1.jar
C:\apache-maven-3.5.0\lib\jcl-over-slf4j-1.7.22.jar
C:\apache-maven-3.5.0\lib\jcl-over-slf4j.license
C:\apache-maven-3.5.0\lib\jsr250-api-1.0.jar
C:\apache-maven-3.5.0\lib\jsr250-api.license
C:\apache-maven-3.5.0\lib\maven-artifact-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-artifact.license
C:\apache-maven-3.5.0\lib\maven-builder-support-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-builder-support.license
C:\apache-maven-3.5.0\lib\maven-compat-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-compat.license
C:\apache-maven-3.5.0\lib\maven-core-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-core.license
C:\apache-maven-3.5.0\lib\maven-embedder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-embedder.license
C:\apache-maven-3.5.0\lib\maven-model-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-model-builder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-model-builder.license
C:\apache-maven-3.5.0\lib\maven-model.license
C:\apache-maven-3.5.0\lib\maven-plugin-api-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-plugin-api.license
C:\apache-maven-3.5.0\lib\maven-repository-metadata-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-repository-metadata.license
C:\apache-maven-3.5.0\lib\maven-resolver-api-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-api.license
C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic.license
C:\apache-maven-3.5.0\lib\maven-resolver-impl-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-impl.license
C:\apache-maven-3.5.0\lib\maven-resolver-provider-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-resolver-provider.license
C:\apache-maven-3.5.0\lib\maven-resolver-spi-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-spi.license
C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon.license
C:\apache-maven-3.5.0\lib\maven-resolver-util-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-util.license
C:\apache-maven-3.5.0\lib\maven-settings-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-settings-builder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-settings-builder.license
C:\apache-maven-3.5.0\lib\maven-settings.license
C:\apache-maven-3.5.0\lib\maven-shared-utils-3.1.0.jar
C:\apache-maven-3.5.0\lib\maven-shared-utils.license
C:\apache-maven-3.5.0\lib\maven-slf4j-provider-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-slf4j-provider.license
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject-0.3.3.jar
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject.license
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus-0.3.3.jar
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus.license
C:\apache-maven-3.5.0\lib\plexus-cipher-1.7.jar
C:\apache-maven-3.5.0\lib\plexus-cipher.license
C:\apache-maven-3.5.0\lib\plexus-component-annotations-1.7.1.jar
C:\apache-maven-3.5.0\lib\plexus-component-annotations.license
C:\apache-maven-3.5.0\lib\plexus-interpolation-1.24.jar
C:\apache-maven-3.5.0\lib\plexus-interpolation.license
C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher-1.4.jar
C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher.license
C:\apache-maven-3.5.0\lib\plexus-utils-3.0.24.jar
C:\apache-maven-3.5.0\lib\plexus-utils.license
C:\apache-maven-3.5.0\lib\slf4j-api-1.7.22.jar
C:\apache-maven-3.5.0\lib\slf4j-api.license
C:\apache-maven-3.5.0\lib\wagon-file-2.12.jar
C:\apache-maven-3.5.0\lib\wagon-file.license
C:\apache-maven-3.5.0\lib\wagon-http-2.12-shaded.jar
C:\apache-maven-3.5.0\lib\wagon-http.license
C:\apache-maven-3.5.0\lib\wagon-provider-api-2.12.jar
C:\apache-maven-3.5.0\lib\wagon-provider-api.license
C:\apache-maven-3.5.0\LICENSE
C:\apache-maven-3.5.0\NOTICE
C:\apache-maven-3.5.0\README.txt
3.代码优化
下面,修改代码,实现层级打印,其实就是利用制表符实现。
package io;
import java.io.File;
import java.util.Scanner;
public class Test8 {
/**
* 题目:把文件夹下文件和文件夹按层级打印(linux中树形打印)
* 分析
* @param args
* 1.获取所有文件夹和文件,存储在File数组中
* 2.遍历数组
* 3.无论是文件还是文件夹都需要打印
* 4.如果是文件夹,递归调用
*/
public static void main(String[] args) {
File dir = getDir();
printDir(dir,0);
}
public static void printDir(File dir,int level) {
//1.获取所有文件夹和文件,存储在File数组中
File[] subFiles = dir.listFiles();
//2.遍历数组
for (File subfile : subFiles) {
//3.无论是文件还是文件夹都需要打印
for (int i = 0; i <= level; i++) {
System.out.print("\t");
}
System.out.println(subfile);
//4.如果是文件夹,递归调用
if(subfile.isDirectory()) {
printDir(subfile,level + 1);
}
}
}
/**
* 获取文件夹路径
* @return
*/
public static File getDir () {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件路径。");
while(true) {
String line = sc.nextLine(); //键盘录入文件夹路径存储
File dir = new File(line); //封装file对象
//判断
if( !dir.exists()) {
System.out.println("你输入的文件夹路径不存在,请重新输入。");
}else if(dir.isFile()) {
System.out.println("你输入的是一个文件的路径,请换成文件夹路径");
}else {
return dir;
}
}
}
}
继续测试打印maven层级效果。
请输入一个文件路径。
C:\apache-maven-3.5.0
C:\apache-maven-3.5.0\bin
C:\apache-maven-3.5.0\bin\m2.conf
C:\apache-maven-3.5.0\bin\mvn
C:\apache-maven-3.5.0\bin\mvn.cmd
C:\apache-maven-3.5.0\bin\mvnDebug
C:\apache-maven-3.5.0\bin\mvnDebug.cmd
C:\apache-maven-3.5.0\bin\mvnyjp
C:\apache-maven-3.5.0\boot
C:\apache-maven-3.5.0\boot\plexus-classworlds-2.5.2.jar
C:\apache-maven-3.5.0\conf
C:\apache-maven-3.5.0\conf\logging
C:\apache-maven-3.5.0\conf\logging\simplelogger.properties
C:\apache-maven-3.5.0\conf\settings.xml
C:\apache-maven-3.5.0\conf\toolchains.xml
C:\apache-maven-3.5.0\lib
C:\apache-maven-3.5.0\lib\aopalliance-1.0.jar
C:\apache-maven-3.5.0\lib\cdi-api-1.0.jar
C:\apache-maven-3.5.0\lib\cdi-api.license
C:\apache-maven-3.5.0\lib\commons-cli-1.4.jar
C:\apache-maven-3.5.0\lib\commons-cli.license
C:\apache-maven-3.5.0\lib\commons-io-2.5.jar
C:\apache-maven-3.5.0\lib\commons-io.license
C:\apache-maven-3.5.0\lib\commons-lang3-3.5.jar
C:\apache-maven-3.5.0\lib\commons-lang3.license
C:\apache-maven-3.5.0\lib\ext
C:\apache-maven-3.5.0\lib\ext\README.txt
C:\apache-maven-3.5.0\lib\guava-20.0.jar
C:\apache-maven-3.5.0\lib\guice-4.0-no_aop.jar
C:\apache-maven-3.5.0\lib\jansi-1.13.jar
C:\apache-maven-3.5.0\lib\jansi-native
C:\apache-maven-3.5.0\lib\jansi-native\linux32
C:\apache-maven-3.5.0\lib\jansi-native\linux32\libjansi.so
C:\apache-maven-3.5.0\lib\jansi-native\linux64
C:\apache-maven-3.5.0\lib\jansi-native\linux64\libjansi.so
C:\apache-maven-3.5.0\lib\jansi-native\osx
C:\apache-maven-3.5.0\lib\jansi-native\osx\libjansi.jnilib
C:\apache-maven-3.5.0\lib\jansi-native\README.txt
C:\apache-maven-3.5.0\lib\jansi-native\windows32
C:\apache-maven-3.5.0\lib\jansi-native\windows32\jansi.dll
C:\apache-maven-3.5.0\lib\jansi-native\windows64
C:\apache-maven-3.5.0\lib\jansi-native\windows64\jansi.dll
C:\apache-maven-3.5.0\lib\javax.inject-1.jar
C:\apache-maven-3.5.0\lib\jcl-over-slf4j-1.7.22.jar
C:\apache-maven-3.5.0\lib\jcl-over-slf4j.license
C:\apache-maven-3.5.0\lib\jsr250-api-1.0.jar
C:\apache-maven-3.5.0\lib\jsr250-api.license
C:\apache-maven-3.5.0\lib\maven-artifact-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-artifact.license
C:\apache-maven-3.5.0\lib\maven-builder-support-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-builder-support.license
C:\apache-maven-3.5.0\lib\maven-compat-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-compat.license
C:\apache-maven-3.5.0\lib\maven-core-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-core.license
C:\apache-maven-3.5.0\lib\maven-embedder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-embedder.license
C:\apache-maven-3.5.0\lib\maven-model-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-model-builder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-model-builder.license
C:\apache-maven-3.5.0\lib\maven-model.license
C:\apache-maven-3.5.0\lib\maven-plugin-api-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-plugin-api.license
C:\apache-maven-3.5.0\lib\maven-repository-metadata-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-repository-metadata.license
C:\apache-maven-3.5.0\lib\maven-resolver-api-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-api.license
C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic.license
C:\apache-maven-3.5.0\lib\maven-resolver-impl-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-impl.license
C:\apache-maven-3.5.0\lib\maven-resolver-provider-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-resolver-provider.license
C:\apache-maven-3.5.0\lib\maven-resolver-spi-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-spi.license
C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon.license
C:\apache-maven-3.5.0\lib\maven-resolver-util-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-util.license
C:\apache-maven-3.5.0\lib\maven-settings-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-settings-builder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-settings-builder.license
C:\apache-maven-3.5.0\lib\maven-settings.license
C:\apache-maven-3.5.0\lib\maven-shared-utils-3.1.0.jar
C:\apache-maven-3.5.0\lib\maven-shared-utils.license
C:\apache-maven-3.5.0\lib\maven-slf4j-provider-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-slf4j-provider.license
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject-0.3.3.jar
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject.license
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus-0.3.3.jar
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus.license
C:\apache-maven-3.5.0\lib\plexus-cipher-1.7.jar
C:\apache-maven-3.5.0\lib\plexus-cipher.license
C:\apache-maven-3.5.0\lib\plexus-component-annotations-1.7.1.jar
C:\apache-maven-3.5.0\lib\plexus-component-annotations.license
C:\apache-maven-3.5.0\lib\plexus-interpolation-1.24.jar
C:\apache-maven-3.5.0\lib\plexus-interpolation.license
C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher-1.4.jar
C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher.license
C:\apache-maven-3.5.0\lib\plexus-utils-3.0.24.jar
C:\apache-maven-3.5.0\lib\plexus-utils.license
C:\apache-maven-3.5.0\lib\slf4j-api-1.7.22.jar
C:\apache-maven-3.5.0\lib\slf4j-api.license
C:\apache-maven-3.5.0\lib\wagon-file-2.12.jar
C:\apache-maven-3.5.0\lib\wagon-file.license
C:\apache-maven-3.5.0\lib\wagon-http-2.12-shaded.jar
C:\apache-maven-3.5.0\lib\wagon-http.license
C:\apache-maven-3.5.0\lib\wagon-provider-api-2.12.jar
C:\apache-maven-3.5.0\lib\wagon-provider-api.license
C:\apache-maven-3.5.0\LICENSE
C:\apache-maven-3.5.0\NOTICE
C:\apache-maven-3.5.0\README.txt
上面需要注意每一个子文件夹调用层级打印方法,里面参数的level是不一样,这个值决定了打印几个制表符。我们调用输入参数0,表示第一层目录只打印一个制表符。