需求:传入文件路径(目录),打印该路径(目录)下所有文件名,要求含目录层次关系
1、File类的方法回顾
- boolean isDirectory() // 判断File是否为目录
- boolean isFile() // 判断是否为文件
- boolean exists() // 判断文件是否存在
- boolean delete() // 删除文件,成功则返回true,否则false
- String getName() // 返回包含这个File对象的文件名的字符串,但不包含路径信息
- String getPath() // 返回定义File时的路径
- String getAbsolutePath() // 得到的是绝对路径,但不会处理“.”和“..”的情况
- String getCanonicalPath() // 返回包含这个文件的规范路径名的字符串,该方法会使用恰当的目录分隔符,并可以获得底层文件系统所选择的大小写处理方式,详见Google、百度用法
- String[] list() // 返回某个目录下的所有文件和目录的文件名,返回的是String数组
- File[] listFiles() // 返回某个目录下所有文件和目录的绝对路径,返回的是File数组
- 其他详见File类相关API
2、思路梳理
- 1,参数检验:判断该文件或目录是否存在,不存在时在控制台输出提醒或报错
- 2,判断指定路径是否为文件,若为文件则输出文件名
- 3,若为目录则获取当前目录下的所有文件名与目录名的File数组
- 4,遍历该数组元素:若元素为文件,则直接输出文件名;若为子目录,则在输出子目录名后,获取子目录对应的File数组,此过程需用递归,并加深遍历搜索深度
- 5,缩进层次的定义:定义"|---"为层次缩进,且初始缩进层次为1(即tab=1),每进入一次递归方法就将缩进层次加1;
- 6,在打印文件名之前需打印当前的缩进层次,该缩进层次随当前递归的深度而不同,故调用for循环打印"|---",该循环次数即为tab的大小
3、代码
public class PrintFileNameUtil {
private int tab = 1;
/**
* 打印文件名主方法
* @param path 传参
*/
public void printFileName(String path){
try {
paramTest(path);
} catch (IOException e) {
e.printStackTrace();
}
iteratorPrint(path,tab);
}
/**
* 参数检验
* @param path 输入参数--路径
* @throws IOException IO异常
*/
private void paramTest(String path) throws IOException{
File dir = new File(path);
if (!dir.exists()){
System.out.println(String.format("文件路径错误!---> %s",path));
throw new IOException();
}
}
/**
* 递归打印
* @param path 路径
* @param tab 递归层次
*/
private void iteratorPrint(String path,int tab) {
File file = new File(path);
File[] subDir = file.listFiles();
for (File subDirFile:subDir) {
for (int j = 0; j < tab; j++) {
System.out.print("|---");
}
System.out.println(subDirFile.getName());
if (subDirFile.isDirectory()) {
iteratorPrint(subDirFile.getAbsolutePath(),tab+1);
}
}
}
}
PrintFileNameUtil util = new PrintFileNameUtil();
util.printFileName("your dir");
- 结果展示
-
![](https://i-blog.csdnimg.cn/blog_migrate/e20c81ce4537330763ef338d13ed8e74.png)