File类--java进阶day12

1.File类

File类为文件或文件夹对象

2.File类的使用

要想使用File类,就需要创建对象,常用的构造方法如下

1.根据文件路径字符串创建对象

2.父类路径和子类路径字符串一起创建对象

就是一个路径被分成两半进行创建

3.父类文件对象路径和子类字符串路径一起创建对象

和第二种差别不大,就是前面的父路径从字符串改为了File对象

2.细节

1.File既可以用来关联文件,也可以关联文件夹

2.传入File的文件(夹)路径,可以是存在的,也可以是不存在的,因为我们会有方法来创建不存在的文件(夹)

3.相对路径和绝对路径

1.绝对路径

路径写的十分完整,通常是存在磁盘中

2.相对路径

路径写的不够完整,创建的文件对象是针对于当前java项目的,存在java项目中

如果想在java程序的某个包下创建文件对象,只需右键copy该包的绝对路径


然后把绝对路径复制到File类的构造方法中

因为我们创建的这个文件是相对于当前包,所以可以省略掉它的磁盘位置,直接从src写起

4.File常用方法

[1]判断相关

如图,根据我们创建的File对象进行判断,exists判断对应的File对象是否存在

[2]获取相关

1.length()

调用该方法可以返回文件的字节数量

该方法返回的文件字节数量是正确的,返回文件夹的字节数量是错误的,这是该api的bug

2.getAbsolutePath()

返回文件的绝对路径(最全的路径)

我们写的是相对路径,返回的是文件对于该项目的绝对路径

3.getName()

返回文件的名称

4.lastModified()

返回文件上一次修改的时间的毫秒值,直接打印出来的毫秒值太大,很难获取信息,所以我们搭配Date的构造方法使用


..

案例


...

5.File类的创建方法

[1]createNewFile()

创建一个新的空文件

如下图,红色框中标记,返回值是判断是否创建成功,如果已存在则返回false

[2]mkdirs()

创建一个空的文件夹,并且能在该文件夹中继续创建文件夹

如下图,黄色框标记,返回值判断是否创建成功,若已存在返回false

创建的文件夹名称可以随意命名,即使使用文件名称给文件夹命名也可以

6.File类的删除方法

调用该方法可以删除文件和文件夹

注意

上图,我们想直接删除aaa会返回false,因为aaa中还存在bbb,delete只能删除空文件夹

7.File类的遍历方法

使用listFiles(),可以获取到所有的一级文件对象,并且将获取到的对象全部装入数组中

"一级文件对象"就是指在进入我们指定的路径后第一次碰见的文件和文件夹

如下图,aaa和1.txt、2.txt都是第一次就遇见的文件夹和文件,三者都可以获取。即使aaa里面还有文件或者文件夹,由于不是第一次碰见,也就无法获取到

注意

我们电脑中会带有一些要有权限才能访问的文件夹,此时调用listFiles就会返回null,可能导致空指针异常,所以我们在使用listFiles时都要进行非空判断

案例

endWith:判断某个字符串末尾是否与括号里的字符串匹配

第三步,当判断file是文件时,再判断是否符合名称后缀为.java

执行else,说明file此时只能是文件夹,之前说过电脑里会带有一些权限文件夹,所以我们可以在这时进行非空判断

普通文件夹也可能包含权限文件夹,所以还要调用listFiles获取到所有文件和文件夹,若不为null则调用递归

递归:此时file是文件夹,放入我们自己写的方法中,又会重复上述步骤,获取该文件夹的每一个文件和文件夹,继续打印文件、判断文件夹

另一种非空判断写法

在最开始就进行非空判断,只有不是null才可以进行操作

这里不能使用else,因为还有可能存在是文件,但后缀名不是.java的文件

案例

之前我们说过,delete方法只能删除空的文件夹,如果带有文件的文件夹则无法删除,所以,我们要先将文件夹里的文件删除掉

如果拿到的是文件夹,我们就要进入到该文件夹,然后继续重复上述步骤

写到这里,其实还没结束,我们调用方法,会发现文件全都删掉了,但是文件夹还存在


..

..

观察我们写的代码也会发现,我们只对文件进行了删除操作,文件夹没删,仔细想一想,什么时候删除文件最为合适呢?

--当for循环走完后,再对文件夹进行操作最为合适

当f是文件夹时,会走递归,f会作为参数传给形参(file),所以,在删除文件夹时,应该调用file.delete()

解释:为什么要在for循环结束后,删除文件夹

1.获取到所有一级文件对象后,遍历数组,第一个aaa是文件夹,所以走递归,aaa作为形参传入我们写的方法

2.继续获取aaa里面的一级文件对象,遍历数组,bbb又是文件夹,接着走递归,bbb被传入形参

3.获取bbb里面的一级文件对象,遍历数组,发现只有文件,全部删掉后,数组为空了,循环就得停止,循环停了,就代表文件夹里没东西了,此时就可以删除文件夹了

4.当bbb被删掉后,我们写的方法逻辑全部走完,就可以弹栈了,之后以此类推

案例

length方法返回文件夹的大小有误,所以,我们需要手动编写代码

案例

很明显,这里我们要用到双列集合,键对应后缀名,值对应个数

按照上图,写法还存在一些问题,有些文件可能没有后缀名,切割后只有0号索引,就会导致索引越界异常,所以,我们需要单独计算这些没有后缀名的文件

有些文件名会特别奇怪,可能带有多个. 如:a.b.c,这时文件的后缀名应该是c,我们要是直接按照一号索引来获取后缀名就不严谨,所以还需要完善

当文件中存在后缀名时,将后缀名加入集合中

如果file是文件夹,非空判断后,递归

整体代码(下图没有将集合放入数组,而是用static修饰直接使用)

之后,遍历集合,打印结果即可

posted @ 2025-04-13 16:13  直実  阅读(7)  评论(0)    收藏  举报