File类

本文详细介绍了Java中的File类,包括其静态变量、绝对路径与相对路径的概念,以及构造方法和常用方法如获取路径、判断文件/目录、创建与删除等。此外,还探讨了递归的基本概念,通过递归实现文件和目录的遍历,并展示了如何使用递归在特定目录下查找.java文件。最后,提到了FileFilter接口在文件过滤中的应用,以及使用Lambda表达式进行优化。

一 File类

java.io.File类:文件和目录路径名称的抽象表示形式

java把电脑中的文件和文件夹(目录)封装为一个File类,我们可以使用File类对文件和文件夹进行操作

File类是一个与系统无关的类,任何操作系统都可以使用这个类中的方法

重点:三个单词 File:文件       directory:文件夹/目录      path:路径

1.1 File类的静态变量

; 路径分隔符  Lunux是

操作路径 : 不能写死了 ,可能在不同操作系统进行操作,可以用 “c:File.separator”方式

1.2 绝对路径和相对路径

绝对路径:是一个完整路径

相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录,可以简化书写

注意:

1,路径是不区分大小写的

2,路径中的文件名windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠。

1.3  File类的构造方法

public File(String pathname)

通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。String pathname:字符串的路径名称,有没有无所谓,可以是文件或者文件夹

public File(String parent, String child) 

从父路径名字符串和子路径名字符串创建新的 File实例。参数:把路径分成了量部分  (String parent 父路径    String child 子路径)

好处:父路径和子路径,可以单独书写,用起来灵活,都可以变化

父路径是File类型,可以使用File的方法操作路径

public File(File parent, String child)

从父抽象路径名和子路径名字符串创建新的 File实例。

1.4 File中常用方法

1.4.1 获取功能的方法

public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() :将此File转换为路径名字符串(是什么样就是什么)
public String getName() :返回由此File表示的文件或目录的名称(传递路径的结尾部分,文件/文件夹)。
public long length() :返回由此File表示的文件的长度(以字节为单位,文件夹大小没有大小概念,不能获取文件夹长度。没有文件则返回0)。

1.4.2 判断功能的方法

public boolean exists() :此File表示的文件或目录是否实际存在。存在:true
public boolean isDirectory() :此File表示的是否为目录。判断构造方法中给定的路径是否以文件夹结尾
public boolean isFile() :此File表示的是否为文件。判断构造方法中给定的路径是否以文件结尾

注意事项:

电脑的硬盘中只有文件/文件夹,两个方法是互斥的。

这两个方法适用前提,路径是存在的

1.4.3 创建和删除功能的方法

public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。

注意:1,只能创建文件,不能创建文件夹。

2,创建文件的路径必须存在,否则会抛出异常。

返回boolean值

public boolean delete() :删除由此File表示的文件或目录。

true:文件/文件夹删除成功,返回true

false:文件夹中有内容,删除不成功,返回false;路径不存在返回false。

public boolean mkdir() :创建由此File表示的目录。只能创建单级空文件夹。


public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。能创建单级空文件夹,也能创建多级空文件夹(只能创建文件夹)

1.5 File类的遍历

public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。隐藏也可以获取

注意:list方法和listFile方法遍历的是构造方法中给出的目录

如果构造方法中给出的目录的路径不存在,会抛出空指针异常

如果构造方法中给出的路径不是一个目录,也会抛出空指针异常

public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

注意:list方法和listFile方法遍历的是构造方法中给出的目录,获取目录中所有的文件夹/文件,把文件/文件夹封装为File对象,多个File对象存储到File数组中

如果构造方法中给出的目录的路径不存在,会抛出空指针异常

如果构造方法中给出的路径不是一个目录,也会抛出空指针异常

二 递归

2.1 概述

递归:指在当前方法内调用自己的这种现象。

递归的分类:
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
构造方法,禁止递归

递归的使用前提:

1,当调用方法的时候,方法的主体不变,每次调用方法的参数不同。

2.2 递归求n-1求和

public class DiGuTest {
    public static void main(String[] args) {
int he = sum(5);
        System.out.println(he);
    }
    public static int sum(int n){
        if(n == 1){
            return 1; // 等于1时停止,返回1
        }
        return n+sum(n-1);
    }
}

注意:使用递归求和,main方法调用sum方法,sum方法会一直调用sum方法导致在内存中有多个sum方法(频繁创建方法,调用方法,销毁方法,效率低下)

2.3 递归求阶乘

public class DiGuiTest01 {
    public static void main(String[] args) {
        int re = jiechen (3);
        System.out.println(re);
    }
    public static int jiechen (int n){
        if(n == 1){
            return 1;
        }
        return n*jiechen(n-1);
    }
}

2.4 递归打印多级目录

public class DiGuiTest02 {
    public static void main(String[] args) {
        File file = new File("c:\\abc");
        getAllFile(file);
    }
    public static void getAllFile  (File f){
        File[] files = f.listFiles();// 创建File数组
        for (File k:files) {   //增强for循环遍历
            System.out.println(k);
        }

    }
}

这个代码得到的只是abc目录下的文件和文件夹,不包含子文件夹

解决:先对遍历得到的file对象进行判断,看是否是文件夹。

如果是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹,遍历文件夹的方法,所以直接调用这个方法即可就是递归

改进:

public class DiGuiTest02 {
    public static void main(String[] args) {
        File file = new File("c:\\abc");
        getAllFile(file);
    }

    public static void getAllFile(File f) {
        System.out.println(f);  // 打印文件夹,调用时可以把文件夹打印出来
        File[] files = f.listFiles();
        for (File k : files) {
            if (k.isDirectory()) { //先判断是不是文件夹
                getAllFile(k);
            } else {
                System.out.println(k);
            }
        }
    }
}

三 综合案例

3.1 文件搜索

搜索D:\aaa 目录中的.java 文件。

把File对象f转成字符串

public class DiGuiTest02 {
    public static void main(String[] args) {
        File file = new File("c:\\abc");
        getAllFile(file);
    }

    public static void getAllFile(File f) {
        System.out.println(f);  // 打印文件夹,调用时可以把文件夹打印出来
        File[] files = f.listFiles();
        for (File k : files) {
            if (k.isDirectory()) { //先判断是不是文件夹
                getAllFile(k);
            } else {
         String s = k.toString(); //将路径转成字符串
          boolean b = s.endsWith("java");// 判断是否是java文件
          if(b){                        //是则打印出
              System.out.println(k);
            }
        }
    }
}

3.2 文件过滤器

java.io.FileFilter 是一个接口,是File的过滤器。 该接口的对象可以传递给File类的

File[ ]  listFiles(FileFilter  filter)   作用:用来过滤文件(File 对象)

抽象方法:用来过滤文件的方法
boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true。 Flie pathname:使用ListFiles方法遍历目录,得到每一个文件对象

File[ ]  ListFiles(FileNameFilter filter):实现此接口的实现类实例可用于过滤文件名。

作用:用于过滤文件名称

抽象方法:用来过滤文件的方法

boolean accept(File dir ,String name)

参数:File dir:构造方法中传递的被遍历的目录

String name:使用ListFiles方法遍历目录,得到每一个文件对象

//创建过滤器的实现类
public class FileFilterImpl implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if (pathname.isDirectory()) {
            return  true;
        }
        return pathname.getName().toLowerCase().endsWith("java");
    }
}

注意:

两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则

3.3 Lamda优化

public static void printDir3(File dir) {
// lambda的改写
File[] files = dir.listFiles(f ‐>{
return f.getName().endsWith(".java") || f.isDirectory();
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir3(file);
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值