概述
有个需求要求对文件中的所有目录进行递归查找
demo
如下图,首先获取到根目录所有数据,如果文件类型是目录,获取目录路径,以这个目录路径为新根目录路径,获取新根目录路径下的所有数据,如果文件类型是目录,获取目录路径,以这个目录路径为新根目录路径…如此反复
核心代码如下:
完整代码如下:
有这样一种情况,需要对目录下的文件和目录进行统计,为此做了一个抽象类能够方便扩展
public abstract class FieSystemPath {
/*遍历所有的目录及所有的文件,计算目录数及文件数*/
protected String path;
protected ArrayList<File> filesList;
public FieSystemPath(String path){
this.path = path;
}
public abstract ArrayList<File> search();
public abstract long countNumOfFiles();
public abstract long countSizeOfFiels();
public String getPath(){
return path;
}
}
public class FilePath extends FieSystemPath{
public FilePath(String path) {
super(path);
super.filesList = new ArrayList<>();
}
@Override
public ArrayList<File> search() {
File[] files = new File(path).listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()){
path = files[i].getPath();
search();
}else {
filesList.add(files[i]);
}
}
return filesList;
}
@Override
public long countNumOfFiles() {
return filesList.size();
}
@Override
public long countSizeOfFiels() {
long countNum = 0;
for (File file:filesList) {
countNum += file.length();
}
return countNum;
}
public static void main(String[] args) {
FilePath filePath = new FilePath("D:/work/learn/book");
ArrayList<File> search = filePath.search();
search.stream().forEach(System.out::println);
long countNumOfFiles = filePath.countNumOfFiles();
System.out.println("countNumOfFiles:"+countNumOfFiles);
long countSizeOfFiels = filePath.countSizeOfFiels();
System.out.println("countSizeOfFiels:"+countSizeOfFiels);
}
}
有人会问,目录接口调用的结束条件是什么,由于目录调用条件是有for循环的,对于整体来说,第一个循环在遍历的时候,获取到新目录路径,会调用search函数,遍历新路径下的数据,这时候已经没有新的路径了,当第二个循环遍历完了之后,就会返回第一个循环,继续往下找,如此反复,当第一个循环的i==file.length的时候,整个函数就结束了,所以结束条件隐含在了for循环中