File类以及递归

发布时间:2024年01月20日

File类

? delete()方法

? ?delete()方法是File类的一个实例方法,用于删除指定的文件或目录。其语法如下:

? ?public boolean delete()

? ? 方法返回一个布尔类型的值,表示删除操作是否成功。如果删除成功,则返回true;否则返回false。

? ?需要注意的是,delete()方法只能删除空目录或者文件。如果要删除一个非空目录,需要先删除目录中的所有文件和子目录,然后再删除该目录。

下面是一个使用delete()方法删除文件或目录的示例代码一

import java.io.File;

public class DeleteExample {
    public static void main(String[] args) {
        // 文件路径
        String filePath = "C:/path/to/file.txt";
        
        // 创建一个File对象
        File file = new File(filePath);
        
        // 判断文件是否存在
        if (file.exists()) {
            // 删除文件
            if (file.delete()) {
                System.out.println("文件删除成功");
            } else {
                System.out.println("文件删除失败");
            }
        } else {
            System.out.println("文件不存在");
        }
    }
}

? ? ? 在上述示例中,首先创建一个File对象,然后使用exists()方法判断文件是否存在。如果存在,则调用delete()方法进行删除操作,并根据返回值判断删除是否成功。

? 代码示例二:


package file;

import java.io.File;

/**
?* 删除一个目录
?*/
public class DeleteDirDemo {
? ? public static void main(String[] args) {
? ? ? ? //将当前目录下的demo目录删除
? ? ? ? File dir = new File("demo");
// ? ? ? ?File dir = new File("a");
? ? ? ? if(dir.exists()){
? ? ? ? ? ? dir.delete();//delete方法删除目录时只能删除空目录
? ? ? ? ? ? System.out.println("目录已删除!");
? ? ? ? }else{
? ? ? ? ? ? System.out.println("目录不存在!");
? ? ? ? }
? ? }
}

? ? ?总结: delete()方法是File类中用于删除文件或目录的方法,可以删除空目录或文件。需要注意的是,如果要删除非空目录,需要先删除目录中的所有文件和子目录。该方法返回一个布尔类型的值,表示删除操作是否成功。?

访问一个目录中的所有子项

? listFiles()

? ? ? ?listFiles方法是用于返回一个File对象数组,表示文件路径下的所有文件和子目录。这个方法有多个重载,可以根据不同的参数进行调用。

? ? ?以下是listFiles方法的一些常用重载:

  1. listFiles():返回当前路径下的所有文件和子目录。这个方法不会递归地遍历子目录。

  2. listFiles(FileFilter filter):返回当前路径下满足指定过滤器条件的文件和子目录,其中FileFilter是一个接口,用于过滤文件。

  3. listFiles(FilenameFilter filter):返回当前路径下满足指定文件名过滤器条件的文件和子目录,其中FilenameFilter也是一个接口,用于过滤文件名。

下面是一个示例代码,演示如何使用listFiles方法:

import java.io.File;

public class ListFilesExample {
    public static void main(String[] args) {
        File dir = new File("C:/path/to/directory");
        
        // 获取目录下的所有文件和子目录
        File[] files = dir.listFiles();
        
        // 判断是否为空
        if (files != null) {
            // 遍历文件数组
            for (File file : files) {
                System.out.println(file.getName());
            }
        }
    }
}

? ? ? 在上面的示例中,首先创建一个File对象表示一个目录。然后使用listFiles方法获取目录下的所有文件和子目录,返回一个File数组。最后,通过遍历文件数组,打印每个文件和子目录的名称。

代码示例二:


package file;

import java.io.File;

/**
?* 访问一个目录中的所有子项
?*/
public class ListFilesDemo1 {
? ? public static void main(String[] args) {
? ? ? ? //获取当前目录中的所有子项
? ? ? ? File dir = new File(".");
? ? ? ? /*
? ? ? ? ? ? boolean isFile()
? ? ? ? ? ? 判断当前File表示的是否为一个文件
? ? ? ? ? ? boolean isDirectory()
? ? ? ? ? ? 判断当前File表示的是否为一个目录
? ? ? ? ?*/
? ? ? ? if(dir.isDirectory()){
? ? ? ? ? ? /*
? ? ? ? ? ? ? ? File[] listFiles()
? ? ? ? ? ? ? ? 将当前目录中的所有子项返回。返回的数组中每个File实例表示其中的一个子项
? ? ? ? ? ? ?*/
? ? ? ? ? ? File[] subs = dir.listFiles();
? ? ? ? ? ? System.out.println("当前目录包含"+subs.length+"个子项");
? ? ? ? ? ? for(int i=0;i<subs.length;i++){
? ? ? ? ? ? ? ? File sub = subs[i];
? ? ? ? ? ? ? ? System.out.println(sub.getName());
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

? ? ? ? 需要注意的是,listFiles方法只能返回可读取的文件和目录,并且返回的是绝对路径名。同时,对于某些特定的操作系统或文件系统,可能会出现某些文件无法访问的情况,此时listFiles方法可能返回null。因此,在使用listFiles方法时,应该先进行null的判断。?

获取目录中符合特定条件的子项

? ? 重载的listFiles方法:File[] listFiles(FileFilter)

? ?该方法要求传入一个文件过滤器,并仅将满足该过滤器要求的子项返回。

? ?代码示例


package file;

import java.io.File;
import java.io.FileFilter;

/**
?* 重载的listFiles方法,允许我们传入一个文件过滤器从而可以有条件的获取一个目录
?* 中的子项。
?*/
public class ListFilesDemo2 {
? ? public static void main(String[] args) {
? ? ? ? /*
? ? ? ? ? ? 需求:获取当前目录中所有名字以"."开始的子项
? ? ? ? ?*/
? ? ? ? File dir = new File(".");
? ? ? ? if(dir.isDirectory()){
// ? ? ? ? ? ?FileFilter filter = new FileFilter(){//匿名内部类创建过滤器
// ? ? ? ? ? ? ? ?public boolean accept(File file) {
// ? ? ? ? ? ? ? ? ? ?String name = file.getName();
// ? ? ? ? ? ? ? ? ? ?boolean starts = name.startsWith(".");//名字是否以"."开始
// ? ? ? ? ? ? ? ? ? ?System.out.println("过滤器过滤:"+name+",是否符合要求:"+starts);
// ? ? ? ? ? ? ? ? ? ?return starts;
// ? ? ? ? ? ? ? ?}
// ? ? ? ? ? ?};
// ? ? ? ? ? ?File[] subs = dir.listFiles(filter);//方法内部会调用accept方法

? ? ? ? ? ??
? ? ? ? ? ? File[] subs = dir.listFiles(new FileFilter(){
? ? ? ? ? ? ? ? public boolean accept(File file) {
? ? ? ? ? ? ? ? ? ? return file.getName().startsWith(".");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
? ? ? ? ? ? System.out.println(subs.length);
? ? ? ? }
? ? }
}

使用递归操作删除一个目录

? ? ? 什么是递归

? ? ? ? ? ??递归是一种函数调用自身的方法。在编程中,递归可以解决需要重复执行相同或类似任务的问题。递归函数通过不断调用自身来实现任务的重复执行,每一次函数调用都会将问题分解为更小的子问题,直到达到递归基,也就是最小的可能情况,然后逐步解决每个子问题,最终得到解决整个问题的结果。

? ? ? ? ?递归的含义在于通过自我调用来重复解决问题,使得代码更加简洁、易于理解和实现。递归的思维方式可以帮助我们将复杂的问题分解为简单的子问题,从而更容易解决。然而,递归可能会导致性能问题和堆栈溢出等风险,因此在使用递归时需要谨慎考虑递归的终止条件和递归深度,以避免这些问题。在使用递归时,我们需要确保在每一次递归调用中都能够向着递归基靠近,并且最终递归能够终止。? ??

循环是重复执行某个步骤,而递归是重复整个过程。

代码示例?


package file;

import java.io.File;

/**
?* 编写一个程序,要求实现1+2+3+4+....100并输出结果。
?* 代码中不能出现for,while关键字
?*
?* 编写程序计算:
?* 一个人买汽水,1块钱1瓶汽水。3个瓶盖可以换一瓶汽水,2个空瓶可以换一瓶汽水。不考虑赊账问题
?* 问20块钱可以最终得到多少瓶汽水。
?*
?* 删除一个目录
?*/
public class Test {
? ? public static void main(String[] args) {
? ? ? ? File dir = new File("./a");
? ? ? ? delete(dir);
? ? }

? ? /**
? ? ?* 将给定的File对象表示的文件或目录删除
? ? ?* @param file
? ? ?*/
? ? public static void delete(File file){
? ? ? ? if(file.isDirectory()) {
? ? ? ? ? ? //清空目录
? ? ? ? ? ? File[] subs = file.listFiles();
? ? ? ? ? ? for (int i = 0; i < subs.length; i++) {
? ? ? ? ? ? ? ? File sub = subs[i];//从目录中获取一个子项
? ? ? ? ? ? ? ? //将该子项删除
? ? ? ? ? ? ? ? delete(sub);//递归调用
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? file.delete();
? ? }
}

总结:

? ? 递归是一种在代码中调用自身的技术,用于解决某些问题。在Java中,递归是通过一个方法调用自身来实现的。

? ? 递归方法由两部分组成:基本情况和递归情况。基本情况是结束递归的条件,当满足基本情况时,递归方法将停止调用自身并返回结果。递归情况是递归方法自身调用的部分,它将在满足一定条件时继续调用自身。

? ?递归在解决一些问题时非常有用,比如树的遍历、链表的反转等。但需要注意的是,递归可能会导致栈溢出问题,因为每次递归调用都会将方法压栈,当递归调用层级过深时,栈空间可能会不足。

? ?File类是Java中用于处理文件和目录的类之一。其中的listFiles()方法用于获取目录中的所有文件和子目录。它返回一个File数组,包含目录中所有的文件和子目录的File对象。

? ?使用listFiles()方法可以方便地遍历目录中的所有文件和子目录。可以使用递归来处理每个子目录,以便深度遍历整个目录树。

? ??


?

文章来源:https://blog.csdn.net/Flying_Fish_roe/article/details/135633936
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。