07Java的文件夹创建&遍历

创建文件夹(mkdir,mkdirs)

创建文件夹的两种方法:

import java.io.File;
/**
 *
 * @author 发达的范
 * @date 2021/02/05 15:19
 */
public class makeFolds {
    
    
    public static void main(String[] args) {
    
    
        //指定的这个路径中/fada/fadada两个文件夹都是不存在的,所以使用mkdir创建失败,使用mkdirs创建成功
        File direction = new File("E:/(A)PostgraduateFlies/JavaLearning/fada/fadada");
        boolean flag=direction.mkdirs();
        System.out.println(flag);
    }
}

需要注意的是,这里的mkdir(),mkdirs()方法与创建文件的方法createNewFile()有一点相同,如果不存在创建成功,如果已经存在,则创建失败。

遍历文件夹的下一级(list,listFile)

import java.io.File;

/**测试 list:返回该文件夹中所有文件对象的名称
 * listFile:返回该文件夹中所有文件对象
 *
 * @author 发达的范
 * @date 2021/02/05 15:19
 */
public class makeFolds01 {
    
    
    public static void main(String[] args) {
    
    
        File dir = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects");
        String[] subNames = dir.list();//list方法返回的是路径下所有文件(夹)名称组成的一个数组
        for (String s : subNames) {
    
    //使用增强for循环遍历数组
            System.out.println(s);
        }
        File[] subFiles = dir.listFiles();//listFiles方法返回的是路径下所有的文件(夹)对象组成的数组
        for (File f : subFiles) {
    
    
            System.out.println(f.getAbsolutePath());//获取文件对象的绝对路径
//            System.out.println(f);//直接输出的也是绝对路径
        }
    }
}

运行结果:
image-20210205205625346
image-20210206215236006

需要注意的是:list(),listFile()方法都是遍历指定路径文件夹的下一级,实际上除了下一级,往往还有子孙级。

获取计算机上所有磁盘的盘符:

File[] roots = dir.listRoots();
for (File r : roots) {
    
    
    System.out.println(r);
}

运行结果:
image-20210205210239221

遍历文件夹的所有子孙级

思路1:使用循环访问文件夹的子文件,直到访问的对象是文件时结束。

思路2:使用递归打印文件夹的所有子孙级。

但是,相应的这两种思路都有弊端。思路1使用循环,循环终止条件是访问对象是文件,但是如果一个文件夹里面既有文件夹又有文件,那么程序是如何访问,该如何结束循环?思路2使用递归,但是每次递归都是压栈操作,如果文件夹的子孙级很多,那么就会大量压栈造成内存空间占用过大。所以一般的思路是:能用循环解决尽量不用递归

import java.io.File;

/**
 * 打印文件夹的所有子孙级名称
 *
 * @author 发达的范
 * @date 2021/02/05 15:19
 */
public class makeFolds02 {
    
    
    public static void main(String[] args) {
    
    
//        File dir = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects");
        File dir = new File("E:/(A)PostgraduateFlies/GitHub Upload Folder");
        printNames(dir,0);
    }

    public static void printNames(File file,int layer) {
    
    
        for (int i = 0; i <layer ; i++) {
    
    
            System.out.print("  -  ");
        }
        System.out.println(file.getName());
        if (null == file || !file.exists()) {
    
    //如果传递的是空对象或文件不存在
            return;
        } else if (file.isDirectory()) {
    
    
            File[] files = file.listFiles();
            for (File f : files) {
    
    
                printNames(f,layer+1);
            }
            //for (File f : file.listFiles()) {
    
    
            //   printNames(f, layer + 1);
            //}
        } else {
    
    
            System.out.println(file.getName());
        }

    }
}

统计文件夹所有子孙级文件的大小(使用递归)

import java.io.File;

/**
 * 统计文件夹的所有子孙级文件的大小
 *
 * @author 发达的范
 * @date 2021/02/05 15:19
 */
public class makeFolds03 {
    
    
    private static long length = 0L;

    public static void main(String[] args) {
    
    
        File dir = new File("E:/(A)PostgraduateFlies/GitHub Upload Folder");
        count(dir);
        System.out.println(length);
    }

    public static void count(File file) {
    
    
        if (null != file && file.exists()) {
    
    //如果文件存在
            if (file.isDirectory()) {
    
    //如果是文件夹
                for (File f : file.listFiles()) {
    
    
                    count(f);
                }
            } else {
    
    //如果是文件
                length += file.length();
            }
        } else {
    
    
            return;
        }
    }
}

运行结果:
image-20210206215408320

image-20210206215425290.png


上面只是简单实现了统计文件夹及其子孙级的大小的功能,下面使用面向对象的方式重新实现该功能。

/**
 * 统计文件夹的所有子孙级文件的大小
 *
 * @author 发达的范
 * @date 2021/02/06 21:40
 */
public class makeFolds03 {
    
    
    public static void main(String[] args) {
    
    
       DirCount dirCount= new DirCount("E:/(A)PostgraduateFlies/EndNote X9&Github");
       dirCount.count(dirCount.getSrc());
       System.out.println(dirCount.getLength());
    }
}
import java.io.File;

/**
 * 统计文件夹的所有子孙级文件的大小
 *
 * @author 发达的范
 * @date 2021/02/06 21:45
 */
public class DirCount {
    
    
    private static long length;
    private static String path;
    private static File src;

    public DirCount() {
    
    

    }

    public DirCount(String path) {
    
    
        this.path = path;
        this.src = new File(path);
    }

    public static long getLength() {
    
    
        return length;
    }

    public static File getSrc() {
    
    
        return src;
    }

    public void count(File file) {
    
    
        if (null != file && file.exists()) {
    
    //如果文件存在
            if (file.isDirectory()) {
    
    //如果是文件夹
                for (File f : file.listFiles()) {
    
    
                    count(f);
                }
            } else {
    
    //如果是文件
                length += file.length();
            }
        } else {
    
    
            return;
        }
    }
}

运行结果:
image-20210206214957199

image-20210206214947259

猜你喜欢

转载自blog.csdn.net/fada_is_in_the_way/article/details/113731378