认识文件
我们先来认识狭义上的文件 (file) 。针对硬盘这种持久化存储的 I/O 设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据 而存在,我们把这部分信息可以视为文件的元信息
![](https://i-blog.csdnimg.cn/blog_migrate/46858f957569038407bab06efe8c3757.png)
树型结构组织 和 目录同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹 (folder) 或者目录 (directory) 的概念。
文件路径(Path)
如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径( absolute path )。
![](https://i-blog.csdnimg.cn/blog_migrate/a752937b56d9b62f7b6d5b12d5e4e99d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b92631c83a6915c6740f337dc8c6edb3.png)
File
File,即文件、文件夹,一个File对象表示了磁盘上的某个文件或文件夹。在java中,File类实质是以文件或者文件夹的路径来操作的。File 类是 java.io 包中唯一代表磁盘文件本身的对象。File类的类图如下 :
File类实现了Serializable和Comparable两个接口。当然,学过API常用工具专题——集合篇章后,这就是老面孔了。我们再来回顾一下——
Serializable接口的实现,使File类的对象可以串行化,串行化后,对象可以进行网络传输,也可以保存到文件。而Comparable接口的实现使得File对象可以进行比较。File类以文件或文件夹为单位进行操作,因此不能直接访问文件的内容,若想访问文件内容,需要配合java中的IO流来完成。
构造方法
1.File (String pathname):
需要传入String类型的文件路径。
需要用File类型作接收。
2.File(String parent, String child):
和第一种构造方式大同小异。不过是将文件路径劈开了,分为父路径和子路径两部分,作为两个形参。
3.File(File parent, String child):
与前两种构造方式略有差异:将文件路径劈开后,又先将父路径封装成了File类型,然后再分别将“File类型的父路径” 和 “String类型的子路径”传上去。
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 : 1° mkdir其实就是make directory的缩写。
2° 当我们创建一个File类对象时,仅仅是在内存中有了一个File对象,还未与磁盘发生实际的联系,只有当我们通过createNewFile()方法成功创建文件后,磁盘的相应位置才会创建实际存在着的文件。
代码演示:
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);
}
}
删除功能的方法:
①常用删除方法:
delete() : 删除当前File类对象指定的文件(只能删除文件 和 空文件夹)
PS : 注意也是以boolean类型作为接收。
②代码演示:
大家注意,方才我们用创建方法在D:\JAVA\IDEA\fileEX目录下创建了1.txt文本文件,如图:
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);
}
}
判断功能的方法:
①常用三种判断方法:
isDirectory(): 判断file对象对应的路径是否为目录
isFile(): 判断file对象对应的路径是否为文件
exists(): 判断file对象对应的路径是否存在
我们还是在D:\JAVA\IDEA\fileEX目录下作演示,因为刚才唯一的1.txt文本文件在演示删除功能时删掉了,所以我们可以先对这个不存在的路径做一个判断,再用file对象重新创建一个1.txt文本文件,然后再对它进行判断。结果不言而喻:第一次判断不存在,第二次存在。
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. 即文件只有在被创建后才能被判断为是文件。
获取功能的方法
常见七种获取方法:
getAbsolutePath(): 获取file对象对应的绝对路径
getPath(): 获取file对象对应的相对路径
getName(): 获取file的文件名
getParent(): 获取file的父级目录
length(): 获取file的当前大小(以字节[byte]计算,以long类型做接收)
list(): 获取指定目录下所有文件(夹)的名称数组
listFiles(): 获取指定目录下所有文件(夹)的File类型数组
绝对路径与相对路径的区别我们在前言已经说过了,这里不再赘述。
2)再强调一点,IDEA相对路径一般指相对于当前项目路径开始 (以src目录开头)。up还是建议使用绝对路径。
3)list() 和 listFiles() 两个方法,主要区别是返回值类型不同,前者用String[] 作接收,后者用File[]作接收。
4)前四种获取方法均以String类型作接收。
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文件夹为栗:
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类的本质,即File类操作的是磁盘中文件的路径,并且要熟悉File类常用的成员方法(创建功能,删除功能,判断功能,获取功能)。