java File类基础 万字详解(通俗易懂)

  • Post author:
  • Post category:java



目录


一、前言:


1.人话:


2.关于相对路径和绝对路径:


3.关于java中 要打出右斜杠’\’的问题:


错误做法:


正确做法:


为啥讲这个?


二、概念(介绍):


三、构造方法:


1.File (String pathname):


2.File(String parent, String child):


3.File(File parent, String child):


4.代码演示:


四、成员方法:


1.创建功能的方法:


①前言:


②常见三种创建方式:


③代码演示:


2.删除功能的方法:


①常用删除方法:


②代码演示:


3.判断功能的方法:


①常用三种判断方法:


②代码演示:


4.获取功能的方法:


①常见七种获取方法:


②代码演示:


相对路径和绝对路径的具体展示:


五、完结撒❀


一、前言:

1.人话:

大家好,今天分享一下关于File类的那些事儿,File类

常用的构造方法和成员方法up都会一一进行代码演示

。这篇文章以基础为主,


适合0基础快速入门,或者初学者查缺补漏


都可以,注意代码中的

注释也很重要

。up会尽量以通俗易懂的方式将内容分享给大家。所有文章都会适时补充,良工不示人以朴。



感谢阅读!



(

PS: IDEA讲解,点击目录可以跳转。

)

2.关于相对路径和绝对路径:


绝对路径:

指的是

从顶层目录

(windows下为盘)

开始

定位,形成的路径。


相对路径:

指的是

从当前目录

(IDEA默认从项目开始)

开始

定位,形成的路径。

如果是IDEA项目中的文件,你可以直接右键,选择

Copy Path/Refrence…

,(当然如果你用中文的话,肯定能找到),演示如下:(

之后讲到File类的获取方法时有具体的代码演示)

如上面GIF图所示,


Absolute Path即绝对路径


,下面的


Path From Content Root就是相对路径


🌶。


PS:建议使用绝对路径。

3.关于java中 要打出右斜杠’\’的问题:

错误做法:

这是新手最容易犯的一个错误。因为File类操作路径,而路径分隔符不是左斜线就是右斜线,但

在java中,右斜杠本身有转义符的意思

,因此,直接输出右斜杠会直接报错,如下:

public class Test {
    public static void main(String[] args) {
        //这么输出直接报错!
        //System.out.println("👴头铁,就要这么干:" + \);
        //System.out.println("👴头铁,就要这么干2:" + "\");

        /*
            Error:
                头铁一号会报非法字符的错误
                头铁二号会报未结束的字符串的错误
            Reason:
                这是因为\是转义符,\" 相当于输出一个双引号,
                但因此你字符串就烂尾了。
        */
    }
}

正确做法:



想打印出一条右斜杠,需要连续输入两个\\键


,如下:

public class Demo {
    public static void main(String[] args) {
        //如何输出右斜杠?
        System.out.println("给👴输出右斜杠:" + "\\");
    }
}

为啥讲这个?

File类会操作文件路径,而


文件路径的路径分隔符可以使用一条左斜线/ 或者两条右斜线\\ ,单独使用一条右斜线会报错



二、概念(介绍):

File,即文件、文件夹,一个


File对象表示


了磁盘上的某个


文件





文件夹





在java中,File类实质是以文件或者文件夹的



路径



来操作的





File 类是 java.io 包中唯一代表磁盘文件本身的对象

。File类的类图如下 :

File类实现了Serializable和Comparable两个接口。当然,学过API常用工具专题——集合篇章后,这就是老面孔了。我们再来回顾一下——



Serializable接口的实现,使File类的对象可以串行化,串行化后,对象可以进行网络传输,也可以保存到文件。而Comparable接口的实现使得File对象可以进行比较



File类

以文件或文件夹为单位

进行操作

,因此

不能直接访问文件的内容

,若想访问文件内容,需要配合java中的IO流来完成。大家有兴趣也可以去看看up之前写得IO流基础的万字详解。


三、构造方法:

1.File (String pathname):


需要传入文件路径的String类型。


需要用File类型作接收。

2.File(String parent, String child):


和第一种构造方式大同小异。不过是将文件路径劈开了,分为父路径和子路径两部分,分开传上去。

3.File(File parent, String child):


与前两种构造方式略有差异

:将文件路径劈开后,又

先将父路径封装成了File类型

,然后再分别将File类型的父路径和String类型的子路径传上去。


4.

代码演示

:



我们以D:\JAVA\IDEA下的fileEX作为演示,注意这是个空文件夹,如图:



我们先在file包下创建一个FileConstructors类作为演示类,如图:

FileConstructors类

代码如下:

package knowledge.iocurrent.file;

import java.io.File;
import java.io.IOException;

public class FileConstructors {
    public static void main (String[] args) throws IOException {//建议直接抛出父类异常
//演示File类的三种构造方法:(1.txt之后会在创建功能的演示中创建)
    //1.File (String pathname):
        File file1 = new File("D:\\JAVA\\IDEA\\1.txt");
        System.out.println("给👴看看file1对象长啥样:\n" + file1);
        System.out.println("---------------------------------");

    //2.File(String parent, String child):
        File file2 = new File("D:/JAVA/IDEA/", "2.txt");
        System.out.println("给👴看看file2对象长啥样:\n" + file2);
        System.out.println("---------------------------------");

    //3.File(File parent, String child):
        File parent = new File("D:/JAVA/IDEA");
        File file3 = new File(parent, "3.txt");
        System.out.println("给👴看看file3对象长啥样:\n" + file3);
    }
}


输出结果 :

可以看到,我们的

File类型对象,其实就是磁盘文件的

路径



四、成员方法:

1.创建功能的方法:

①前言:



对于创建功能,如果合法路径对应的文件不存在,就创建该文件并返回true;如果该文件已经存在,就不创建,返回false





其实对于删除功能和判断功能的方法,返回值类型也为boolean类型。

②常见三种创建方式:


createNewFile() :

见名知意,就是

创建一个新文件

。(由路径创建File对象对应的文件)


mkdir():

创建目录(即文件夹),但

只能是单级目录


mkdirs():

创建目录(即文件夹),但

既可以是单级目录,又可以是多级目录


PS :







mkdir其实就是make directory

的缩写。








当我们创建一个File类对象时,仅仅是在内存中有了一个File对象,还未与磁盘发生实际的联系,只有当我们通过createNewFile()方法成功创建文件后,磁盘的相应位置才会创建实际存在着的文件。



代码演示


:


我们仍然以刚才那个路径作演示,注意fileEX这个文件夹下是空的,如图:


我们先在file包下创建一个Create类作为演示类,如图:

Create类

代码如下:

package knowledge.iocurrent.file;

import java.io.File;
import java.io.IOException;

public class Create {
    public static void main(String[] args) throws IOException{//建议直接抛出父类异常IOException
//演示三种创建方式:
    //1.createNewFile():
        /*
            注意1.txt这个文件是不存在的,但是我们可以通过file1.createNewFile()方法,
            创建file1对象对应的文件,即1.txt文件
         */
        File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
        boolean bool1 = file1.createNewFile();
        boolean bool1ex = file1.createNewFile();//相同的文件对象只能成功创建一次。除非你删了它。

        System.out.println("创建1.txt文件成功了吗:" + bool1);//第一次创建成功,是true。
        System.out.println("文件已经存在,创建1.txt文件成功了吗:" + bool1ex);//第二次输出就是false了,因为已经存在。
        System.out.println();

    //2.mkdir:
        File file2 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt但目录");
        boolean bool2 = file2.mkdir();

        System.out.println("创建1.txt目录情况如何:" + bool2);
        System.out.println();

    //3.mkdirs:
        File file3 = new File("D:\\JAVA\\IDEA\\fileEX\\我是目录\\a\\b");
        boolean bool3 = file3.mkdirs();

        System.out.println("创建多级目录成功了没有:" + bool3);
    }
}

输出结果及运行效果——


输出结果:


运行效果:

2.删除功能的方法:

①常用删除方法:


delete() :


删除当前对象指定的文件(只能删除文件和空文件夹)





PS :




注意也是以boolean类型作为接收




②代码演示:

大家注意,方才我们用创建方法在D:\JAVA\IDEA\fileEX目录下创建了1.txt文本文件,如图:

现在我们试着

用File类的删除功能来删掉1.txt这个文本文件

。我们在file包下创建一个Delete类作为演示类,

代码如下:

package knowledge.iocurrent.file;

import java.io.File;        //莫忘了导包
import java.io.IOException;

public class Delete {
    public static void main(String[] args) throws IOException{
//演示删除功能:
        File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
        boolean bool = file1.delete();

        System.out.println("1.txt到底删掉了没有:" + bool);
    }
}

输出结果及运行效果——


输出结果:


运行效果:

🆗,1.txt壮烈牺牲。(bushi)

3.判断功能的方法:

①常用三种判断方法:


isDirectory():



判断

file对象对应的路径

是否为目录


isFile():



判断

file对象对应的路径

是否为文件


exists():



判断

file对象对应的路径

是否存在

②代码演示:

我们还是在D:\JAVA\IDEA\fileEX目录下作演示,因为刚才唯一的1.txt文本文件在演示删除功能时删掉了,所以我们可以

先对这个不存在的路径做一个判断,再用file对象重新创建一个1.txt文本文件,然后再对它进行判断

。结果不言而喻:第一次判断不存在,第二次存在。

我们在file包下创建一个Judge类作为演示类,如图:

Judge类

代码如下:

package knowledge.iocurrent.file;

import java.io.File;
import java.io.IOException;

public class Judge {
    public static void main(String[] args) throws IOException {
//演示三种判断方法:
    //1.isDirectory():
        //先来封装一个目录的file对象
        File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\我是目录");
        boolean bool1 = file1.isDirectory();

        System.out.println("file1对象对应的路径是不是目录:" + bool1);
        System.out.println("---------------------------------------------");
    //2.isFile():
        boolean bool2 = file1.isFile();

        System.out.println("file1对象对应的路径是不是文件:" + bool2);
        System.out.println("---------------------------------------------");
    //3.exists():
        File file2 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
        //注意这时候这个文件还没有被创建
        boolean bool3 = file2.exists();
        boolean bool3ex = file2.isFile();
        System.out.println("file2对应的1.txt这个文件现在存在吗:" + bool3);
        System.out.println("1.txt现在还没创建,那它是文件吗:" + bool3ex);
        System.out.println("---------------------------------------------");

        file2.createNewFile();
        boolean bool4 = file2.exists();
        boolean bool4ex = file2.isFile();
        System.out.println("已经创建的1.txt这个文件现在存在了吗:" + bool4);
        System.out.println("已经创建的1.txt是文件吗:" + bool4ex);
    }
}
/*
    Summary:
        文件只有在被创建后,才能被判断为是文件!
*/

输出结果及运行效果——


输出结果:

从输出结果来看,假如1.txt文件没有创建时,判断它是不是文件,结果居然是false,当然创建后,它既存在,也是文件。因此我们发现:


The file can be judged as file only when it has been created.






文件只有在被创建后才能被判断为是文件




运行效果:

4.获取功能的方法:

①常见七种获取方法:


getAbsolutePath():



获取


file对象对应的


绝对路径


getPath():



获取


file对象对应的


相对路径


getName():



获取


file的


文件名


getParent():



获取


file的


父级目录


length():



获取


file的


当前大小(以字节计算,以long类型做接收)


list():



获取


指定目录下所有文件(夹)的


名称数组


listFiles():



获取


指定目录下所有文件(夹)的


File类型数组



PS:










1)绝对路径与相对路径的区别我们在前言已经说过了,这里不再赘述。



2)再强调一点,IDEA相对路径一般相对于当前项目路径开始。up还是建议使用绝对路径。



3)list()和listFiles()两个方法,主要区别是返回值类型不同,前者用String[] 作接收,后者用File[]作接收。



4)前四种获取方法均以String类型作接收。


②代码演示:

开始之前,先确认一下我们fileEX文件夹下有哪些文件,如图:

我们在file包下创建一个Obtain类作为演示类,如图:

Obtain类

代码如下:

package csdn.knowledge.api_tools.iocurrent.file;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

public class Obtain {
    public static void main(String[] args) throws IOException {
//演示File类的五种常用获取方法:
    //1.getAbsolutePath():获取file对象对应的绝对路径
        File file = new File("D:\\JAVA\\IDEA\\fileEX\\");
        String absolutePath = file.getAbsolutePath();
        System.out.println("输出file对象的绝对路径:" + absolutePath);
        /*
            Notice:
            ①因为up这里在创建File对象时,使用的是绝对路径,
             所以我们这里输出的相对路径和绝对路径是一样的。
            ②只有创建的File对象是相对路径,输出的相对路径与绝对路径才会不同。
         */
        System.out.println("=================================");

    //2.getPath(): 获取file对象对应的相对路径
        String path = file.getPath();
        System.out.println("输出file对象的相对路径:" + path);
        System.out.println("=================================");

    //3.getName(): 获取file的文件名
        String fileName = file.getName();
        System.out.println("输出file对象的文件名:" + fileName);
        System.out.println("=================================");

    //4.getName(): 获取file的文件名
        String parentName = file.getParent();
        System.out.println("输出file对象的父级目录:" + parentName);
        System.out.println("=================================");

    //5.length(): 获取file文件的大小(以字节为单位进行计算)
        File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
        long size = file1.length();
        System.out.println("file1文件的大小 = " + size + " byte");
        System.out.println("=================================");

    //6.list(): 获取指定目录下所有文件(夹)的名称数组
        String[] fileNames = file.list();
        /*
            获取到的名称数组我们使用增强for来遍历。
            之后的File数组同理。
         */
        System.out.println("使用增强for遍历名称数组如下:");
        for (String fName : fileNames) {
            System.out.println(fName);
        }
        //此处也可以使用Arrays.toString() 方法来打印,如下:
        System.out.println();
        System.out.println("我们再用一下Arrays.toString()方法试试:");
        System.out.println(Arrays.toString(fileNames));
        System.out.println("=================================");

    //7.listFiles():  获取指定目录下所有文件(夹)的File类型数组
        File[] files = file.listFiles();
        System.out.println("使用增强for遍历File数组如下:");
        for (File filePlus : files) {
            System.out.println(filePlus);
        }

        System.out.println();
        System.out.println("我们再用一下Arrays.toString()方法试试:");
        System.out.println(Arrays.toString(files));
        System.out.println("=================================");
    }
}


运行结果 :

相对路径和绝对路径的具体展示:

因为我们一开始是以绝对路径创建的file对象,所以输出它的绝对路径和相对路径是一样的。只有当以相对路径来创建file对象时,输出的绝对路径和相对路径才不一样。而IDEA默认相对路径只能从项目名开始,因此,我们再以项目下的一个文件为例具体展示一下:

如图,我们以javapace/fileTest/1.txt文件夹为栗:

然后以一个PS类作演示:


代码:

package knowledge.iocurrent.file;

import java.io.File;
import java.io.IOException;

public class Ps {
    public static void main(String[] args) throws IOException {
        //copy一下1.txt的相对路径
        File filePS = new File("javapace/fileTest/1.txt");
        String absolutePath = filePS.getAbsolutePath();
        String path = filePS.getPath();

        System.out.println("1.txt的绝对路径是:" + absolutePath);
        System.out.println("1.txt的相对路径是:" + path);
    }
}
/*
    总结:
            ①在进行创建File对象时,若使用的就是一个绝对路径创建的,
            则输出的相对路径与绝对路径是一样的。
            ②只有创建的File对象是相对路径,输出的相对路径与绝对路径才会不同。
*/


输出结果:

🆗,这样就看出它们的区别了。


五、完结撒❀:

🆗,以上就是我们File类的全部内容了。File类其实算作讲解IO流的第一步铺垫,再往后是异常类,最后就是API常用工具专题——IO流篇章。当然,File类本身没太大难度,能够熟练使用它的一些方法即可。



感谢阅读!



System.out.println(“END—————————————————————————–“);



版权声明:本文为TYRA9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。