其他分享
首页 > 其他分享> > 寒假作业2—遍历某一路径及其子路径下的所有文件(递归和非递归两种方法)

寒假作业2—遍历某一路径及其子路径下的所有文件(递归和非递归两种方法)

作者:互联网

方法一:递归方法:
AllFiles类:

package com.cao.demo.allFiles;

import java.io.File;

/**
 * 作者:曹浩东
 * 使用递归遍历某一路径下的所有文件
 */
public class AllFiles {
    private int fileCount = 0;//文件计数器

    //递归遍历所有文件的方法
    public void show(String path) {
        File file = new File(path);//根据形参path实例化一个File对象
        File[] files = file.listFiles();//返回path路径下 所有文件的File对象
        //判断该目录是否为空
        if (files.length > 0) {
            //遍历该目录下的File对象
            for (int i = 0; i < files.length; i++) {
                //判断该对象是否为文件夹,如果是则递归访问
                if (files[i].isDirectory()) {
                    show(files[i].getPath());
                } else if (files[i].isFile()) {
                    //如果是该对象是文件,则打印。或者进行其他文件操作。
                    System.out.println(files[i].getPath());
                    //计数器加一
                    ++fileCount;
                }
            }
        } else {
            //如果该目录为空,则打印该目录为空
            System.out.println(path + "目录为空...");
        }
    }

    //打印文件数量的方法
    public void count() {
        if (fileCount != 0) {
            System.out.println("共扫描了" + fileCount + "个文件...");
        } else {
            System.out.println("还未进行遍历...");
        }
    }
}

Test类:

package com.cao.demo.allFiles;

public class Test {
    public static void main(String[] args) {
        //用于计时
        long start;
        long end;
        //开始时间
        start = System.currentTimeMillis();
        //实例化AllFiles对象
        AllFiles allFiles = new AllFiles();
        //传入path参数
        allFiles.show("C:\iweb\root");
        //打印文件数量
        allFiles.count();
        //结束时间
        end = System.currentTimeMillis();
        //输出程序耗时
        System.out.println("耗时" + ((end - start) / 1000.000D) + "秒...");
    }
}

结果:
在这里插入图片描述
方法二:队列(层次遍历)
allFiles类:

package com.cao.demo.allFiles2;

import java.io.File;

/**
 * 作者:曹浩东
 * 使用队列遍历某一路径下的所有文件
 */
public class AllFiles {
    private int fileCount = 0;//计数器

    public void show(String path) {
        //根据形参path实例化一个File对象
        File file = new File(path);
        //创建File类型的队列
        File[] Queue = new File[100000];
        //队头和队尾
        int front = -1, rear = -1;
        //入队
        Queue[++front] = file;
        //当队列不为空时循环
        while (front != rear) {
            //出队
            File fileInQueue = Queue[++rear];
            //判断出队的对象是否是文件
            if (fileInQueue.isFile()) {
                //是文件则打印。或者执行其他文件操作
                System.out.println(fileInQueue.getPath());
                //计数器加一
                ++fileCount;
            } else {
                //如果出队的对象是文件夹类型,则返回其下所有文件的File对象
                File[] fileIn = new File(fileInQueue.getPath()).listFiles();
                //依次入队
                for (int i = 0; i < fileIn.length; i++) {
                    Queue[++front] = fileIn[i];
                }
            }
        }
    }

    //打印文件数量的方法
    public void count() {
        if (fileCount != 0) {
            System.out.println("共扫描了" + fileCount + "个文件...");
        } else {
            System.out.println("还未进行遍历...");
        }
    }
}

结果:
在这里插入图片描述
下表为两种方法遍历同一个含有8296个文件的文件夹所花费的时间。

递归(后序遍历)队列(层次遍历)
3.041秒2.168秒

虽然效率提高的程度没有我想象中的大,但方法二还是比方法一提高了约30%的效率

标签:文件,遍历,递归,路径,System,寒假作业,File,println,path
来源: https://blog.csdn.net/qq_44371305/article/details/113653556