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);
                }
            }
    }
}

发布了22 篇原创文章 · 获赞 0 · 访问量 352

猜你喜欢

转载自blog.csdn.net/Yi__Ying/article/details/103813022