N

Norlcayn的博客

A text-focused Halo theme

  • 首页
  • 文章
  • 默认分类
  • 关于
主页 Java File类和递归
文章

Java File类和递归

发表于 2026-01-15 更新于 昨天
作者 Administrator
27~35 分钟 阅读

File类

  • File类代表操作系统的文件对象(文件、文件夹)

File类创建对象

方法名称 说明
public File(String pathName) 根据文件路径创建文件对象
public File(String parent, String child) 根据父路径名 字符串 和子路径名 字符串 创建文件对象
public File(File parent, String child) 根据父路径对应 文件对象 和子路径名 字符串 创建文件对象
  • File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在

示例:

public class FileDemo01 {
    public static void main(String[] args) {
        File f1 = new File("E:\\A.txt");    // 假设E盘下有A.txt文件
        System.out.println(f1.exists());    // true

        File f2 = new File("E:\\A");        // 假设E盘下没有A文件夹
        System.out.println(f2.exists());    // false

        File f3 = new File("E:\\","A.txt");
        System.out.println(f3.exists());    // true

        File f4 = new File(new File("E:\\"),"A");
        System.out.println(f4.exists());    // false
    }
}

路径分为绝对路径和相对路径

绝对路径:从盘符的根目录开始,一直到具体的某个文件或文件夹

相对路径:相对于当前项目

File类常用API

判断方法

方法名称 说明
public boolean isDirectory() 判断此路径名表示的File是否为文件夹
public boolean isFile() 判断此路径名表示的File是否为文件
public boolean exists() 判断此路径名表示的File是否存在

示例:

public class FileDemo02 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("A.txt");
        System.out.println(f1.createNewFile()); // 返回值表示文件是否创建成功,文件不存在才会创建成功

        File f2 = new File("A.txt");
        System.out.println(f2.isFile());    // 判断是否为文件

        File f3 = new File("Day03/src");
        System.out.println(f3.isDirectory());   // 判断是否为文件夹

        File f4 = new File("Day03/src/com/norlcyan/file/FileDemo02.java");  // 就是当前文件
        System.out.println(f4.exists());    // 判断文件或文件夹是否存在
    }
}

练习:

package com.norlcyan.file;

import java.io.File;
import java.util.Scanner;

public class FileTest01 {
    /*
        需求:键盘录入一个文件夹路径,如果输入错误就给出提示,并继续输入,直到正确为止
    */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入文件夹路径:");
            String path = sc.nextLine();
            File file = new File(path);
            if (file.isFile()) {
                System.out.println("该路径是一个文件路径,而非文件夹路径");
            } else if (!file.exists()) {
                System.out.println("该路径不存在");
            } else if (file.isDirectory()) {
                System.out.println("输入成功!!!");
                break;
            }
        }
    }
}

获取方法

方法名称 说明
public long length() 返回文件的大小(字节数量) 注意:如果是文件夹的话,调用该方法返回的结果是错误的
public String getAbsolutePath() 返回文件的绝对路径
public String getPath() 返回定义文件时使用的路径
public String getName() 返回文件的名称,带后缀
public long lastModified() 返回文件的最后修改时间(时间单位:毫秒值)

示例:

public class FileDemo03 {
    public static void main(String[] args) {
        File f1 = new File("A.txt");
        System.out.println(f1.getAbsoluteFile());   // C:\Users\Zhao\Desktop\Java Ai\Code\AdvanceCode\A.txt

        File f2 = new File("C:\\Users\\Zhao\\Desktop\\Java Ai\\Code\\AdvanceCode\\A.txt");
        System.out.println(f2.getName());   // A.txt

        long l = f2.lastModified();
        Date d = new Date(l);
        System.out.println(d);  // Tue Jul 29 21:34:00 CST 2025
    }
}

getPath作用不大,所以了解即可

创建和删除方法

方法名称 说明
public boolean createNewFile() 创建一个新的空的文件
public boolean mkdir() 只能创建一级文件夹
public boolean mkdirs() 可以创建多级文件夹(也可以创建单级文件夹)
public boolean delete() 删除由此抽象路径名表示的文件或空文件夹

返回值表示创建或删除是否成功

delete方法删除的文件是不会留存在回收站的,一定要注意数据丢失

示例:

package com.norlcyan.file;

import java.io.File;
import java.io.IOException;

public class FileDemo04 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("Day03\\B.txt");
        System.out.println(f1.createNewFile());   // true,创建成功(假设没有B.txt的文件)

        File f2 = new File("Day03\\AAA");
        System.out.println(f2.mkdir());     // true,创建成功(假设没有AAA文件夹)

        File f3 = new File("Day03\\AAA\\BBB\\CCC");
        System.out.println(f3.mkdirs());    // true,创建成功(假设没有AAA\\BBB\\CCC这样文件路径)
                                            // mkdirs可以创建单级文件,可以创建多级文件

        System.out.println(f1.delete());
    }
}

遍历方法

方法名称 说明
public File[] listFiles() 获取当前目录下所有的一级文件对象 返回File数组
  • 当调用者File表示的路径不存在时,返回null
  • 当调用者File表示的路径是文件时,返回null
  • 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
  • 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null

示例:

当前有一个文件目录:

Snipaste_2025-07-29_22-18-18

需求是将所有.java的文件打印出来

import java.io.File;
import java.util.Objects;

public class FileDemo05 {
    public static void main(String[] args) {
        method();
    }

    public static void method() {
        // 获取File对象
        File file = new File("E:\\ListFileTest");

        // 将File对象路径下的所有一级文件对象存储到数组中
        File[] files = file.listFiles();

        // 遍历数组
        for (File f : Objects.requireNonNull(files)) {  // 防止空指针
            if (f.getName().endsWith(".java")) {
                System.out.println(f.getName());
            }
        }
    } 
}

如果aaa文件下也有.java文件,想要获取的话就需要用到递归

递归

  • 方法直接或间接调用本身
  • 递归如果没有控制好终止条件,会出现递归死循环,导致栈内存溢出

示例:

public class RecursionDemo01 {
    public static void main(String[] args) {
        method();   // 当不存在终止条件时,递归死循环,最终栈内存溢出

        func01();
    }
    public static void method() {
        // 直接调用自身
        method();
    }

    public static void func01() {
        // 调用func02,func02又调用了func01,就属于间接调用
        func02();
    }

    public static void func02() {
        func01();
    }
}

终止条件就是停止直接调用自身或停止间接调用自身

案例:

  1. 使用递归求阶乘
package com.norlcyan.recursion;

public class RecursionDemo02 {
    public static void main(String[] args) {
        System.out.println(factorial(5));
    }

    public static long factorial(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n * factorial(n - 1);
        }
    }
}

解题思路:将大问题层层转化为一个与原问题相似的,规模更小的问题来解决

递归演示

获取文件夹内所有文件

示例:

package com.norlcyan.file;

import java.io.File;

public class FileDemo06 {
    public static void main(String[] args) {
        File path = new File("E:\\ListFileTest");
        getJavaFile(path);
    }

    public static void getJavaFile(File path) {
        if (path == null) return;           // 防止传入null
        if (!path.exists()) return;         // 防止路径不存在
        if (!path.isDirectory()) return;    // 防止传入的路径为文件而非文件夹

        File[] files = path.listFiles();
        if (files == null) return;          // 防止listFiles方法返回null

        for (File file : files) {
            if (file.isFile() && file.getName().endsWith(".java")) {
                System.out.println(file.getName());
            } else if (file.isDirectory()){
                getJavaFile(file);
            }
        }
    }
}

删除文件夹

  • delete()只能删除空文件夹

示例:

package com.norlcyan.file;

import java.io.File;

public class FileDemo07 {
    public static void main(String[] args) {
        File path = new File("E:\\ListFileTest _Del");
        System.out.println(cleanDirectory(path));
    }

    public static boolean cleanDirectory(File path) {
        File[] files = path.listFiles();
        if (files == null) return false;// 防止listFiles方法返回null
        for (File file : files) {
            if (file.isFile()) {
                file.delete();// 删除文件
            } else{
                if (file.listFiles() != null) {// 防止listFiles方法返回null
                    if (file.listFiles().length == 0) {// 判断是否为空文件夹
                        file.delete();// 删除空文件夹
                    } else {
                        cleanDirectory(file);// 递归调用
                        file.delete();// 调用结束,表示文件清理完成,再清理文件夹
                    }
                }
            }
        }
        return true;
    }
}

统计文件夹大小

示例:

import java.io.File;

public class FileDemo08 {
    public static void main(String[] args) {
        File file = new File("E:\\Program Files");
        System.out.println(getDirectoryStorage(file));
    }

    public static long getDirectoryStorage(File path) {
        File[] files = path.listFiles();
        if (files == null) return -1;
        long storage = 0;
        for (File file : files) {
            if (file.isFile()) {
                storage += file.length();
            } else {
                long directoryStorage = getDirectoryStorage(file);
                storage += directoryStorage;
            }
        }
        return storage;
    }
}
Java
Java语法 递归 File类
许可协议:  CC BY 4.0
分享

相关文章

1月 15, 2026

Java异常处理

异常的介绍和体系结构 异常介绍 指的是程序在编译或执行过程中,出现的非正常的情况(错误) ArrayIndexOutOfBoundsException:索引越界异常 ClassCaseException:类型转换异常 NullPointerException:空指针异常 注意:语法错误,不是异常 异

1月 15, 2026

Java网络编程

网络编程概念 可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术(实现网络通信) 基本的通信架构分为两种:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端) 无论是CS架构还是BS架构,都必须依赖网络编程 Java中提供了java.ne

1月 15, 2026

Java面向对象编程

面向对象介绍 面向对象:并不是一个技术,而是一种编程的指导思想 以什么形式组织代码,以什么思路解决问题 为什么要学习面向对象? 因为生活中,我们要解决问题时,就是采用这种指导思想去解决的 所以,我们写程序去解决问题时,如果也能采用这种指导思想 就会使编程变得非常简单,程序也便于理解 面向对象,重点学

下一篇

Java IO操作

上一篇

接入华为云IOT平台

最近更新

  • Hello Halo
  • 状态机
  • 数据表设计规范
  • 缓存优化
  • 事务失效

热门标签

Halo 异常处理 Redisson 并行 Vue 并发 递归 请求限流 SpringAMQP 类加载器

目录

©2026 Norlcayn的博客. 保留部分权利。

使用 Halo 主题 Chirpy