File类以及递归

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

        需要注意的是,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()方法可以方便地遍历目录中的所有文件和子目录。可以使用递归来处理每个子目录,以便深度遍历整个目录树。

    


 

你可能感兴趣的:(java,开发语言)