javaSE-File类概述

什么是File类

 File类是java中学习IO流的一个必须要学习的类,在此类中定义了对文件和文件夹的一系列操作,因为io流是对文件内容的操作,所以必须先要了解文件和文件夹的相关操作,才能对其内容进行操作。
 那么什么是File类呢,在javaAPI中是这样定义的,java.io.File是文件和目录路径名的抽象表示形式。这是官方定义,通俗的理解就是,File类就是将我们硬盘中的文件或者文件夹的路径封装成一个对象,因为Java是一个面向对象编程,在java中万物皆对象,只有将文件或者文件夹的路径封装成对象,我们才能调用方法,对文件或者文件夹进行创建、查找、删除等一系列操作。
 
 通常学习一个类的基本思路是,先了解它的定义,然后大致了解它的子父类情况,然后再学习它的静态字段,因为静态字段不用创建对象,直接用类名就可以调用;再然后学习它的构造方法,能够用构造方法创建对象,这样就可以使用对象调用它的方法,对其的方法进行学习。本文大致也是这样的顺序。

 File类实现了Serializable, Comparable两大接口以便于其对象可序列化和比较。

File的字段

 在File类中有四个很重要但是不太常用的字段,之所以重要因为这四个字段可以实现文件分隔符的跨平台性,不常用因为我们通常在写程序时如果不是特殊情况因为麻烦就不会使用。
 static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
 static char pathSeparatorChar 与系统有关的路径分隔符。
 
 static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
 static char separatorChar 与系统有关的默认名称分隔符。

对File的静态字段的调用
输出结果
通过上面两张图 ,我们就可以知道,这四个字段的作用就是输出文件在系统中的路径分隔符。其中“ ;”是对个文件路径的分隔,例如我们在当初配置JDK的环境变量时,每一个系统文件的路径在计算机是使用“ ;”进行分隔的,而“ \”是对每一级的文件名称进行分隔的。那么之所以会使用代码的方式获得这两个符号,是因为前面所说的都基于windows系统,程序也是windows系统中运行的。Linux系统中,文件路径分隔符是“ :”,而每级文件名称分隔符是“ /”。
最后可能有人会问,前面代码运行的是第一个和第三个字段,那么第二个和第四个呢?其实,前两个运行结果是一样的,后两个都是一样的。
在这里插入图片描述 在这里插入图片描述
通过查看另外两个的源码,可以发现它们的返回值和程序中调用的那两个是一样的,而且因为加上空字符,所以返回值都是一样,都是String类型。

构造方法

路径

在讲解构造方法之前需要明白两个概念:相对路径和绝对路径。
**绝对路径:**是一个完整的路径,以盘符(c:,D:)开始的路径。我们称之为绝对路径
**相对路径:**是一个简化的路径,相对指的是相对于当前项目的根目录。也就是如果你的路径,不是以盘符开头,那么系统就会认为你的 路径是相对路径,那么它就会从当前所在项目的根目录开始寻找文件。
**注意事项:**第一,路径是不区分大小写;
第二,路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

构造方法

File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。简单地说,就是将文件或者文件夹的路径名 以字符串的形式传入File中,将其封装为对象。
关于传入的参数注意这几点:
String pathname:字符串的路径名称
路径可以是以文件结尾,也可以是以文件夹结尾
路径可以是相对路径,也可以是绝对路径
路径可以是存在,也可以是不存在
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况

File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 通常会将末尾的文件作为子路径,而将文件前的路径作为父路径。这样做的好处就是父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。

File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。简单的说就是,父路径传的是封装好的对象,子路径是字符串形式。这样做的好处就是父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象。

通常,我们使用第一种构造方法较多。

成员方法

因为是对文件或者文件夹的操作,所以File类的成员方法可以分为获取、判断、创建和删除四部分。

获取功能

public String getAbsolutePath() :返回此File的绝对路径名字符串。
这个方法的作用就是获取的构造方法中传递的路径。 无论路径是绝对的还是相对的,getAbsolutePath方法返回的都是绝对路径
**public String getPath() :**将此File转换为路径名字符串。 此方法的作用是获取构造方法中传递的路径,传的是什么路径得到的就是什
么路径。
在这里插入图片描述
**public String getName() :**返回由此File表示的文件或目录的名称。此方法,获取的就是构造方法传递路径的结尾部分(文件/文件夹)。
**public long length() :**返回由此File表示的文件的长度。此文件获取的是构造方法指定的文件的大小,以字节为单位
注意: 文件夹是没有大小概念的,不能获取文件夹的大小
如果构造方法中给出的路径不存在,那么length方法返回0

判断功能

**public boolean exists() :**此File表示的文件或目录是否实际存在。
此方法用于判断构造方法中的路径是否存在。存在:true,不存在:false。
**public boolean isDirectory() :**此File表示的是否为目录。
此用于判断构造方法中给定的路径是否以文件夹结尾 。是:true,否:false
**public boolean isFile():**此File表示的是否为文件。
此 用于判断构造方法中给定的路径是否以文件结尾。 是:true,否:false
注意:
电脑的硬盘中只有文件/文件夹,两个方法是互斥的,同时使用只能有一个是true;
这两个方法使用前提是,路径必须是存在的,否则都返回false

创建和删除功能

**public boolean createNewFile() :**当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
此方法用来创建文件的路径和名称,是在构造方法中给出(构造方法的参数)
**返回值:**布尔值
true:文件不存在,创建文件,返回true
false:文件存在,不会创建,返回false
注意:
1.此方法只能创建文件,不能创建文件夹
2.创建文件的路径必须存在,否则会抛出异常
3、此方法会抛出IOException异常,需要进行抛出。
**public boolean mkdir() :**创建单级空文件夹
**public boolean mkdirs() :**既可以创建单级空文件夹,也可以创建多级文件夹
这两个方法创建文件夹的路径和名称都是在构造方法中给出(构造方法的参数)
**返回值:**布尔值
true:文件夹不存在,创建文件夹,返回true
false:文件夹存在,不会创建,返回false;构造方法中给出的路径不存在返回false
注意:
此两个方法只能创建文件夹,不能创建文件。如果路径是错误的,此方法并不会出现异常,只是不会创建。
**public boolean delete() :**删除由此File表示的文件或目录。
此方法,可以删除构造方法路径中给出的文件/文件夹
**返回值:**布尔值
true:文件/文件夹删除成功,返回true
false:文件夹中有内容,不会删除返回false;构造方法中路径不存在false
注意:
delete方法是直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎

遍历目录(文件夹)

在File类中定义了两个关于获取文件中子文件的方法;
**public String[] list() :**返回一个String数组,表示该File目录中的所有子文件或目录。
**public File[] listFiles() :**返回一个File数组,表示该File目录中的所有的子文件或目录。
注意:
list方法和listFiles方法遍历的是构造方法中给出的目录
如果构造方法中给出的目录的路径不存在,会抛出空指针异常
如果构造方法中给出的路径不是一个目录,也会抛出空指针异常
**list()**方法返回一个String数组,表示该File目录中的所有子文件或目录。遍历构造方法中给出的目录,会获取目录中所有文件/文件夹的名 称,把获取到的多个名称存储到一个String类型的数组中。然后可以对数组进行遍历输出,得到目录。
**list Files()**返回一个File数组,表示该File目录中的所有的子文件或目录。遍历构造方法中给出的目录,会获取目录中所有的文件/文件夹,把文件/文件夹封装为File对象,多个File对象存储到File数组中。因为File类重写了toString方法,所以可以直接对数组进行遍历打印。

递归打印多级目录

递归

在这里简单介绍递归,后面文章会对递归思想有专门概述。
递归简单的说就是自己调用自己,通过方法的不断重复调用达到使问题的最小化。
**分类:**递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归。因为构造方法用来创建对象,一直递归会导致内存中有无数多个对象,直接编译报错。
使用前提:
当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归

案例

获取多级文件夹中以.java结尾的文件
文件夹的目录如图所示:
在这里插入图片描述
在此案例中,我们需要分析两点:
1、我们想获得一个文件夹中的文件,有两种方法分别是list()、listFiles(),获得文件夹中的所有文件或者文件子文件夹;
2、我们需要对获得的文件数组进行遍历,从而判断是文件还是文件夹,如果是文件夹就要进行递归再次进行遍历。因为我们需要调用方法
所以我们自能使用第二种获取文件夹的方式。
3、如果是文件的话,那么我们就要进行判断是否以.java结尾,如果是进行输出。
注意: 1、如何将File文件对象转换成字符串进行结尾的判断?
在这里插入图片描述
2、因为路径名是不区分大小写的,所以我们还有注意进行大小写转换,保证代码的严谨性。

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值