import java.io.File;
import java.util.Scanner;
/**
* 需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印,例如:
aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹。eee中有fff.txt和ggg.txt。打印出层级来。
aaa
bbb.txt
ccc.txt
ddd.txt
eee
fff.txt
ggg.txt
*分析:
*1.获取所有的文件和文件夹,返回的是File数组。
*2.遍历数组。
*3.无论是文件还是文件夹,都需要直接打印。
*4.如果是文件夹,递归调用。
*/
public class Test4 {
public static void main(String[] args) {
File dir = getDir(); //获取文件夹路径
printLevel(dir, 0);
}
//把文件夹中的所有文件以及文件夹的名字按层级打印
public static void printLevel(File dir, int lev) {
//1.获取所有的文件和文件夹,返回的是File数组。
File[] subFiles = dir.listFiles();
//2.遍历数组。
for (File subFile : subFiles) {
for (int i = 0; i <= lev; i++) {
System.out.print("\t");
}
//3.无论是文件还是文件夹,都需要直接打印。
System.out.println(subFile);
//4.如果是文件夹,递归调用。
if(subFile.isDirectory()) {
printLevel(subFile, lev + 1);
// printLevel(subFile, ++lev); ++lev使得原有的层级加一,这将导致,同一文件夹下的其他文件对应的层级加一。也就导致for循环中的判断条件的限制被提高了(例如,i<=0变成i<=1)。同理,lev++也会与所求出现偏差。因此,我们不需要改变lev的值,只需要不断传入即可。
}
}
}
//从键盘接收一个文件夹路径
public static File getDir() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件夹路径:");
while(true) {
String line = sc.nextLine();
File dir = new File(line);
if(!dir.exists()) {
System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
}else if(dir.isFile()) {
System.out.println("您录入的是一个文件路径,请输入一个文件夹路径:");
}else {
return dir;
}
}
}
}