IO流(一) --- File类

File类


为什么需要File类:

File类可以用来对文件的属性进行操作,也可以创建和删除文件;


如何区分文件和文件夹:

  虽然你能认清什么是文件,什么是文件夹,但是你能用语言清楚的表达么?

文件:一般情况下,我们把带有后缀名的称为文件;

文件夹: 我们把不带后缀名的称为文件夹,即目录;

  那有人说,我的电脑里面的文件有的也是没有后缀名的呀?那是为什么呢?因为你没有把后缀名隐藏给关闭,所以你看不到文件的后缀名,可以自行百度解决;

概念: File类是文件和目录路径名的抽象表示,目录和路径都可以用File类来表示;但是要注意,我虽然给了一个路径,但是并不代表根据这个路径就一定能找到指定的文件,所以File类的对象可以是真实存在的File文件也可以不是;


File类的构造方法

构造方法方法说明
File(String pathname)根据给定的路径名来创建文件对象
File(String parent, String child)根据给定的父路径和子路径来创建文件对象
File(File parent, String child)根据给定的父类文件对象和子路径来创建文件对象

代码示例:

public class Demo{
    public static void main(String[] args) {
        // 创建F盘下的a.txt的文件对象
        File file1 = new File("F:\\a.txt");
        
        // 通过给定的父路径和子路径来创建a.txt的文件对象
        File file2 = new File("F:\\java", "a.txt");
        // 通常父路径都为文件夹路径,子路径为文件名也可以为文件夹+文件名
        File file3 = new File("F:\\java", "demo01\\a.txt");
        
        // 通过给定的父文件对象和子路径来创建a.txt文件对象
        File file4 = new File(file2, "demo\\a.txt");
    }
}

为什么没有无参构造方法?

  因为如果我通过无参构造方法创建了文件对象,可是我们都知道一个电脑上面有很多的文件和文件夹,那么,通过该方式创建的文件对象,到底指向我们电脑中的哪个文件或文件夹呢?我们不得而知,所以,要这个无参构造方法是没有任何意义的;


File类的方法

方法方法说明
boolean canRead()判断文件是否可读
boolean canWrite()判断文件是否可写
boolean createNewFile()创建新的文件
boolean delete()删除文件或目录
boolean exists()判断文件或目录是否存在
boolean isFile()判断文件是否是文件
boolean isDirectory()判断是否是目录文件
boolean mkdir()创建目录文件
boolean mkdirs()创建多级目录
String getAbsolutePath()获取文件的绝对路径
String getPath()获取传入构造方法中的路径

创建文件:

public static void main(String[] args) {
    File file = new File("F:\\a.txt");
    // 判断文件是否存在
    if (file.exists()) {
        file.delete(); // 如果存在,则删除原文件
        file.mkdir();
    } else {
        file.mkdir();  // 不存在,则创建该文件
    }
    System.out.println("文件创建成功");
}

注意: 这里运用了delete()方法,它既可以删除文件也可以删除目录,但是被该方法删除的文件和目录不会出现在回收站中,直接被永久的删除了,所以要小心使用;与此同时,如果删除一个目录,而目录中包含其他的文件时,该目录不能被成功删除,其返回值为false;


代码示例:

public static void main(String[] args) {
    File file = new File("F:\\FileTest\\a.txt");
    System.out.println(file.mkdirs());
    System.out.println(file.canRead());
    System.out.println(file.canWrite());
    System.out.println(file.isDirectory());
    System.out.println(file.isFile());
}
运行结果:
    true
    true
    true
    true
    false

  有人可能对isDirectory()的运行结果感到困惑,心想:我明明创建的txt文件,为什么调用isDirectory()方法还返回true呢?因为,我们创建的时候调用的是mkdirs()方法,该方法是创建多级目录,它不包含创建文件的功能,它只能创建目录,所以我们在创建文件的时候一定要小心,不是路径是文件的路径就一定创建出来的就是文件,是不是文件的决定权取决于你所调用的方法,如果是createNewFile(),那么创建出来的就是文件;

递归

概念:

递归指的是方法直接或间接的调用本身的一种现象;即:方法自己调用自己;


为什么需要递归:

为了简化复杂而重复的问题,如求阶乘时,其实总是重复于求解f(n - 1),当是用来递归的时候,只需要调用自身,就可以完成,而不需要我们去不断的去寻求f(n - 1)的解;递归还有很多的应用场景;


递归的条件:

递归头:递归结束的条件;

递归体:调用自身的语句;


递归的注意事项:

  • 如果没有结束条件,那么就会引发栈内存溢出;为什么呢?

    答:我们都知道方法存在于栈中,每当调用方法时就会将方法加载到栈中,如果没有结束条件,那么就会一直加载递归方法,直到耗尽了所有的栈内存然后溢出报错;

  • 虽然递归有结束条件,递归调用的次数不易过多,否则栈内存溢出,这又是为什么呢?

    答:虽然有了结束条件,可以让我们的递归结束了,但是调用的次数达到了栈内存的极限,那么依旧会出现栈内存溢出的现象;


递归求阶乘:

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

public static int test(int n) {
    if (n == 1) { // 递归头,当n==1时,结束递归
        return n;
    } else {
        return n * test(n -1); // 阶乘的特性
    }
}
运行结果:
    120

递归遍历文件:

public static void test(File file) {
    if (file.exists()) {
        File[] files = file.listFiles();
        if (files != null)
            for (File f : files) {
                if (f.isFile()) {
                    System.out.println(f.getName());
                } else {
                    System.out.println(f.getName());
                    test(f);
                }
            }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值