遍历所有文件和子文件
通过文件流遍历,核心就是【递归】,递归的基线就是文件层级,如果是文件夹层级,则调用自己,进行递归。
这里在格式上还进行了约束,要求按照如下格式进行输出打印,以方便阅读。
|D:\Java\practice
|__D:\Java\practice\.metadata
|____D:\Java\practice\.metadata\.lock
|____D:\Java\practice\.metadata\.log
这里将遍历封装了函数,然后将格式打印封装为另一个函数,在遍历方法内部调用了private类修饰的格式打印函数。
/**
*遍历文件和文件夹
*@param dir File类对象
*@param level int类型,表示当前File的文件夹级别,用于调用getSeparatro()方法,以确定格式打印
*/
public static void listDir(File dir, int level) {
System.out.println(getSeparatro(level) + dir.toString()); //父目录打印,标识作用,可以删除
File[] files = dir.listFiles();
level++; //递归,每次会【溯回】操作,对应文件夹的等级会被记录
if (null != files && 0 < files.length) {
for (File file : files) {
//判断是否为文件夹,如果是,则递归,直到基线为文件为止
if (file.isDirectory()) {
listDir(file, level);
} else {
System.out.println(getSeparatro(level) + file);
}
}
}
}
/**
* 判断生成多少分隔符
* @param level 0表示没有分隔符
* @return String类型,返回目录前面的标识符
*/
private static String getSeparatro(int level) {
StringBuilder sb = new StringBuilder();
sb.append("|");
for (int i = 0; i < level; i++) {
sb.append("__");
}
return sb.toString();
}
//打印结果
|D:\Java\practice
|__D:\Java\practice\.metadata
|____D:\Java\practice\.metadata\.lock
|____D:\Java\practice\.metadata\.log
|____D:\Java\practice\.metadata\.mylyn
|______D:\Java\practice\.metadata\.mylyn\.taskListIndex
|________D:\Java\practice\.metadata\.mylyn\.taskListIndex\segments_1
|________D:\Java\practice\.metadata\.mylyn\.taskListIndex\write.lock
|______D:\Java\practice\.metadata\.mylyn\.tasks.xml.zip
|______D:\Java\practice\.metadata\.mylyn\contexts
|______D:\Java\practice\.metadata\.mylyn\repositories.xml.zip
|______D:\Java\practice\.metadata\.mylyn\tasks.xml.zip
|____D:\Java\practice\.metadata\.plugins
|______D:\Java\practice\.metadata\.plugins\org.eclipse.buildship.core
|______D:\Java\practice\.metadata\.plugins\org.eclipse.core.resources
|________D:\Java\practice\.metadata\.plugins\org.eclipse.core.resources\.history
|__________D:\Java\practice\.metadata\.plugins\org.eclipse.core.resources\.history\0
|____________D:\Java\practice\.metadata\.plugins\org.eclipse.core.resources\.history\0\30b7de5
遍历删除所有文件及子文件
电脑上的软件的卸载,本质都是遍历删除,由于程序只能将空文件夹删除,所以必须依据从内到外,由底层到顶层的顺序去一层层的遍历删除。
public static void deleteFile(File dir) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
//判断是否为文件夹,如果是,则递归,直到到达基线(文件层级)为止,然后溯回
if (file.isDirectory()) {
deleteFile(file);
} else {
System.out.println(file.toString() + ":" + file.delete());
}
}
//dir.delete() 方法,返回的是boolean值
System.out.println(dir.toString() + ":" + dir.delete());
}
}
本文介绍了如何使用Java的IO操作遍历所有文件及子文件,重点在于递归方法的应用。同时,文章讲解了如何按照特定格式打印文件路径以提高可读性。此外,还探讨了文件删除的操作,特别是模拟软件卸载过程中的遍历删除文件夹的逻辑,强调了删除顺序的重要性。
374

被折叠的 条评论
为什么被折叠?



