1.File类的构造方法

这个是Java中file类的使用,file的三个构造方法

第一个是一个参数的构造方法:

File(String pathName)这个构造方法的pathname可以是文件也可以是文件夹结尾,所以在使用的时候如果是文件夹结尾可以和另外一个File类进行互动,即第三个构造方法(待理解)

File(String pathParent,String pathChild),这个构造方法是File的两参构造方法之一,通过对父路径或者子路径更改,可以实现灵活的应用。

File(File pathParent,String pathChild),这个是最灵活的应用,可以与第一个构造方法进行互动,第一个构造方法的路径可以是文件夹结尾,那么当生成一个FIle的时候,可以传入到第三个构造方法中的第一个参数,所以只要更改了生成的File对象的指向,就可以实现更改指向路径,或者是说指向的文件夹。

图片

2.File的常用获取路径方法

File中还有获取路径的方法,即:

getAbsolutePath();和getPath();

其中在实例化一个File对象的时候,可以输入有绝对路径和相对路径,所以这两个方法就是一个获取绝对路径,一个获取生成对象时输入的路径,注意的是,无论在生成对象的时候引用的是绝对还是相对路径,getAbsolutePath方法所获取的都是不变的,即生成File对象的时候用的是相对路径,用getAbsolutePath();这个方法返回的就是绝对路径。

作用:

getAbsolutePath();获取的是绝对路径

获取路径的方法的返回值与生成对象时所用的绝对路径或者相对路径无关

getPath();获取的生成对象时输入的路径,

还有一点注意的是:相对路径是指相对于当前目录而言

File类的方法getName();

图片

这个方法得到的是一个路径的最后一个部分,

可以是文件也可以是文件夹。就是返回路径的最后一部分。无论是绝对路径还是相对的路径,都是最后的一部分,包括真假路径都是路径的最后一部分。

FIle类length();方法

File类的length();方法返回值是一个长整型的值,表示文件的长度,是以字节为单位的,因为在计算机中就是以字节为单位存储数据的,需要理解的就是物理的存储单元不等于计算机的最小储存单位,物理储存的单元是bit,计算机的最小单位是Byte,所以计算机显示的基本单位就是8位一字节的字节Byte,现实的长度就是Byte。

重要的一点就是计算机的文件夹是没有大小概念的,即文件夹只是为了方便找到文件的一个路径而已,所以路径是没有大小概念的,文件才有大小的概念。如果文件不存在,那就返回值就是0,如果文件存在,但是只是新建的文件,没有存储东西,那么返回的值也是0。

综上所述,用length();方法得到是以字节为单位的文件长度,如果文件不存在或者是无存放内容,那么返回值就是0.

特别的:当结尾是文件夹时,不会报错,但是返回值仍然是0.即相当于文件不存在。

图片

图片

总结:

图片

3.File判断功能的方法

图片

首先这三个方法的返回值都是Boolean类型的值,即true和false,

三个方法:

        //以上省略
        File f1 = new File("d:\\a.txt");
        System.out.println(f1.getName());
        File f2 = new File("D:");
        System.out.println(f2.length());
        System.out.println("f1存在吗? "+f1.exists());
        System.out.println("f1是文件夹吗? "+f1.isDirectory());
        System.out.println("f1是文件吗?"+f1.isFile());
    }
}

图片

注意输出的是一个Boolean类型的值,所以在判断的时候要特别注意的。

当路径正确的时候:

isFile();和isDirectory();是互斥的方法,即一个为false那么另外一个就是ture

但是但路径不存在的时候,即错误的路径的时候,

三个方法都会返回一个false的值

总结:

exists(); isFile(); isDirectory();这三个方法都是返回了一个Boolean类型的值,当路径真实存在的时候isFile和isDirectory是互斥的方法,即一个为true另外一个就一定是false,

但是当路径不存在或者是假路径的时候,三个方法都会返回一个false的Boolean值

4.File创建和删除的方法

图片

和判断功能的方法一样返回值都是Boolean类型的值,即可以通知用户是否创建成功,

注意:

特殊的:

createNewFile();是有抛出异常的。

路径要正常,只能生成一个文件,不能生成一个文件夹

如果需要创建的文件,那么应该先生成一个对象指向待生成的文件。

然后这个对象去调用createNewFile()这个方法,才能生成一个新的文件。(对象.创建)

只能生成一个文件,不能生成一个文件夹。

通过查询这个方法可以看到,这个方法是一个无参方法,也就是说,需要创建一个文件,那么就需要先生成一个对象指向待生成的文件(用不存在的文件名生成一个对象),然后这个对象是调用这个createNewFile();这个方法,就可以生成这个文件了。

createNewFile();

public boolean createNewFile() throws IOException {
    SecurityManager security = System.getSecurityManager();
    if (security != null) security.checkWrite(path);
    if (isInvalid()) {
        throw new IOException("Invalid file path");
    }
    return fs.createFileExclusively(path);
}
File f3 = new File("d:\\workspace\\Test\\a");
System.out.println(f3.createNewFile());
File f3 = new File("d:\\workspace\\Test\\a");
File f4 = new File("d:\\workspace\\Test\\a.txt");
System.out.println(f3.createNewFile());
System.out.println(f4.createNewFile());

这四行代码可以生成两个文件,虽然第一个没有写具体的文件格式,但是生成了文件,而不是一个文件夹。
图片

创建文件夹:

这两个方法都只能创建文件夹,不能创建文件。

        File f3 = new File("d:\\workspace\\Test\\d.txt");
        File f4 = new File("d:\\workspace\\Test\\c.txt\\a.txt");
//        System.out.println(f3.createNewFile());
        System.out.println(f3.mkdir());
        System.out.println(f4.mkdirs());

图片

图片

看这两个截图和上面的代码,就知道是,看生成的是什么,是要看你的格式是什么,用的方法是什么,而不是只是看名字,可以生成一个名字为a.txt的文件夹,也可以生成一个不带具体格式的a文件,所以看生成的是什么,看调用的方法就可以了,与名字无关。

需要注意的是:

在使用这两个方法的时候,如果已经生成了一个a.txt文件,那么用mkdir()或者是mkdirs生成同名的文件夹的的时候就会出错,特别要注意的一点

File f3 = new File("d:\\workspace\\Test\\d.txt");
File f4 = new File("d:\\workspace\\Test\\c.txt\\a.txt");
System.out.println(f3.createNewFile());
System.out.println(f3.mkdir());
System.out.println(f4.mkdirs());

图片

图片

这两个方法没有抛出异常,即使是路径不存在也不会报错。当然文件夹也不会生成

mkdir()

只能生成一个文件夹。不能生成多个文件夹(父文件夹,子文件夹)

public boolean mkdir() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(path);
    }
    if (isInvalid()) {
        return false;
    }
    return fs.createDirectory(this);
}

mkdirs()

public boolean mkdirs() {
    if (exists()) {
        return false;
    }
    if (mkdir()) {
        return true;
    }
    File canonFile = null;
    try {
        canonFile = getCanonicalFile();
    } catch (IOException e) {
        return false;
    }
    File parent = canonFile.getParentFile();
    return (parent != null && (parent.mkdirs() || parent.exists()) &&
            canonFile.mkdir());
}

图片

直接调用,注意对象的使用。

注意的是这个方法是直接从硬盘上删除文件或者文件夹,不会回收到回收站里面,

是从硬盘的层面删除东西。

也是通过生成对象,然后对象调用这个方法删除自身(文件或者文件夹)

图片

delete();

public boolean delete() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkDelete(path);
    }
    if (isInvalid()) {
        return false;
    }
    return fs.delete(this);
}
File f3 = new File("d:\\workspace\\Test");
System.out.println(f3.delete());

Test文件夹中有多个文件或者文件夹,这个函数会返回一个false值
图片

并不会删除这个文件夹

总结:

无论是创建还是删除文件或者文件夹,都是先生成一个对象,通过对象来调用创建或者是删除的方法,

生成中,是创建一个对象指向待生成文件或者是文件夹,然后调用方法生成文件或者是文件夹。

删除中,是生成一个对象,通过对象来调用方法,如果路径为假或者是文件夹中有多个文件或者是文件夹就返回一个flase

5.File(Files or Directorys)类的遍历

两个方法:

1.public String[] list()

返回值是一个String类型的数组,

System.out.println(Arrays.toString(f3.list()));

这种写法会将字符串数组变成一个字符串,即将整个数组变成以字符串的形式打印出来,这就是toString方法
public File[] listFile()

只是文件夹内部的遍历不能是文件内部的遍历

文件内部的遍历没有意义,同时说起遍历,需要复习for循环的三种写法

这两个方法都可以遍历到隐藏的文件夹/文件

图片

图片

list()和listFiles()方法区别:

1.返回值类型不同:前者为String数组,后者为File对象数组
2.数组中元素内容不同:前者为string类型的【文件名】(包含后缀名),后者为File对象类型的【完整路径】
因此,遍历文件夹中所有文件,包括子文件夹中的文件时,必须用listFiles()方法

简单的说就是list只把当前的目录以字符串数组的形式表达出来,而listFiles就是把当前目录以File类型的数组表达出来,所以这个方法可以结合其他方法进行下一层的目录的输出,因为是File类型的数组,也即File类型的数据,所以可以继续往下遍历

6.FIle获取目录的方法

import java.io.*;
import java.util.Arrays;
public class Main{
    public static void main(String[] args){
       File file = new File("D:\\OneDrive - Microsoft 365\\图片");
        System.out.println(file.getName());
       Files filetest = new Files();
       filetest.printFiles(file);
    }
}
class Files {
     void printFiles(File file) {
        File[] arrF = file.listFiles();
        if(Arrays.toString(arrF).equals("[]"))
            System.out.println(file.getAbsolutePath());
        else
            for (int i = 0; i < arrF.length; i++) {
                if (arrF[i].isFile()) {
                    System.out.println(arrF[i]);
                }
                else if (arrF[i].isDirectory()) {
                    //打印当前的目录:而不是只有目录里面的文件
                    System.out.println(arrF[i]);
                    printFiles(arrF[i]);
                }
            }
    }
}

记得要注意空文件夹的方法

if(Arrays.toString(arrF).equals("[]"))
    System.out.println(file.getAbsolutePath());

这句代码,通过多重的调用方法Arrays.toString(arrF),判断是否为空文件夹
当所有的都已经做好了之后,就可以开始来搜索文件了,搜索文件是一个综合的实践,而且很有技巧,有两种思维去做这个事情,第一个就是在找的时候就把其他的过滤掉,但是如果想做这个的话,有点复杂,最简单的就是先把所有类型的文件都找出来,然后在输出的时候做文章,用endsWith(“.java”)这个函数便可以直接解决问题了。

图片

更简单的可以看:

Java学习-递归打印目录树状结构

最后修改:2020 年 12 月 27 日 11 : 37 AM