1. File 简介
File ?什么是 File?中文的意思就是“文件”。在 Windows 操作系统中,数据是以文件的形式进行存储的。如:文本(.txt)、图片(.jpg、.png)、视频(avi)等。这些文件都被操作系统中的文件系统给管理着。
那么问题来了,在 Java 语言中为什么会存在 File 类呢?大家都知道 Java 语言是一个面向对象的语言,遵循着“万事万物皆为对象”的法则。所以,Java 要想操作文件,就要把文件抽象成一个类------File 类。
Java 中有哪些场景需要操作文件呢?
譬如说:在某个网站进行注册时,需要上传头像。这时,需要流来操作头像文件;在项目中,需要将一些重要的错误信息写入到日志文件中去,等等~~
好了,既然我们已经知道了 Java 中需要使用到 File 类,那么我们来使用呢?让我们一起来实战吧。
2. File API
什么也不多说,直接看 File 类的 API 文档(文章底部有文档分享)。
首先,咋们先看看 API 文档对 File 类的介绍:
An abstract representation of file and directory pathnames.
意思是:文件和目录路径名的抽象表示形式。也就是说:Windows 系统中的“文件”和“文件夹”都用 File 类来表示。
2.1 构造方法
这里只列出部分构造方法:
- File(String pathname) :通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
- File(String parent, String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
- File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
代码如下:
public class FileDemo {
public static void main(String[] args) {
// 方式一:根据文件路径名创建 File 实例
File file1 = new File("test.txt");
// 方式二
File file2 = new File("parent", "child");
// 方式三
File parent = new File("parent");
File file3 = new File(parent, "child");
}
}
上面创建了 3 个 File 实例,用来表示 文件/文件夹。其中方式二和方式三一样。
如果构造方法中的参数(文件路径名,如:test.txt)不存在,那么在创建 File 实例时会不会报错?
不会报错。它只是根据“文件路径名”创建对应的 File 实例,并不会去检查它是否存在的。但如果参数“文件路径名”为 Null,则会报空指针异常。
当然,Jdk 开发商也考虑到了这一点。所以,在 File 类中有相应的方法来判断
2.2 判断方法
- boolean exists() :判断此抽象路径名表示的文件或目录是否存在。
public class FileDemo {
public static void main(String[] args) {
// 方式一
File file1 = new File("test.txt");
boolean b1 = file1.exists();
System.out.println(b1);
// 方式二
File file2 = new File("parent", "child");
boolean b2 = file2.exists();
System.out.println(b2);
// 方式三
File parent = new File("parent");
File file3 = new File(parent, "child");
boolean b3 = file3.exists();
System.out.println(b3);
}
}
我这里都为"false",所以都不存在哈。
当然,还有一些其它判断方法:
- boolean isFile() :判断是否为一个“文件”
- boolean isDirectory() :判断是否为一个“文件夹”
- boolean isAbsolute() :判断是否为绝对路径名
- 等等…
上面说到,我这里没有那三个文件,那该怎么办?是不是该创建啊?那还不简单,我直接用鼠标右键,然后新建一个不就 OK 了。
没错,这种方式很优秀!但我们现在是在学习 File 类啊,而不是学习“如何创建文件/文件夹”,所以,是不是应该干点跟它相关的事?
查看 API 文档,还别说,File 类中还真有创建“文件”和“文件夹”的方法。而且,你们有没有发现,可以用自己的程序来创建“文件”,有没有感觉贼酷。反正,我当初是有这种感觉滴。
2.3 创建文件/文件夹
- boolean createNewFile() :当且仅当不存在此文件时,就会创建一个新的空文件。
- boolean mkdir() :当且仅当不存在此文件夹时,就会创建此文件夹(仅限以及目录)
- boolean mkdirs() :创建文件夹(可多级目录)
项目结构图:
2.3.1 创建文件
createNewFile()
public class FileDemo {
public static void main(String[] args) throws Exception{
File file = new File("test.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
}
第一次调用结果,返回“true”。而且,在项目路径下也创建了一个文件“test.txt”。结果:创建文件成功。
那么,当这个文件已存在时,再次调用那方法会有什么结果呢?
很显然,返回“false”,创建失败。因为此文件已经存在。
不知有没有人思考过:创建的 test.txt 文件夹为什么会在项目路径下面?
因为上面使用了相对路径,此路径默认为“当前项目”的路径。
API 文档中这样写道:
By default the classes in the ava.io package always resolve relative pathnames against the current user directory. This directory is named by the system property user.dir, and is typically the directory in which the Java virtual machine was invoked.
意思是:默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。
用代码表示:
public class FileDemo {
public static void main(String[] args) throws Exception{
String path = System.getProperty("user.dir");
File file = new File(path + "/test.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
}
既然上述说到了用“相对路径”创建文件,那么可以用“绝对路径”来创建文件吗?
阔以,绝对阔以!!这里的绝对定位指的是:文件路径名需要带上磁盘符。
如:
File f = new File("E:\\zzc\\hh.txt");
2.3.2 创建文件夹
2.3.2.1 创建一级目录
public class FileDemo {
public static void main(String[] args) throws Exception{
File file = new File("zzc");
boolean b = file.exists();
System.out.println(b);
boolean mkdir = file.mkdir();
System.out.println(mkdir);
}
}
当此文件夹不存在时,则创建成功;否则,创建失败。
如果我用它创建多级文件夹会有什么后果?
创建失败。不会抛出异常
2.3.2.2 创建多级目录
public class FileDemo {
public static void main(String[] args) throws Exception{
File file = new File("zzc1/zzc");
boolean b = file.exists();
System.out.println(b);
boolean mkdir = file.mkdirs();
System.out.println(mkdir);
}
}
和上面一样,不存在,则创建成功;否则,创建失败。
最后,我发现:我的文件/文件夹创建多了,能用程序删除吗?
能,必须能。
2.4 删除文件/文件夹
- boolean delete() :删除存在的文件或文件夹。
public class FileDemo {
public static void main(String[] args) throws Exception{
File file = new File("zzc1/zzc");
boolean b = file.exists();
System.out.println(b);
boolean delete = file.delete();
System.out.println(delete);
}
}
如果文件/文件夹存在,则删除成功;否则,删除失败,并不会抛出异常哈~
当然,API 文档中还有一些其它方法:
- String[] list() :返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
- File[] listFiles() :返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
- String getName() :返回由此抽象路径名表示的文件或目录的名称。
- String getAbsolutePath() :返回抽象路径名的绝对路径名字符串。
等等…
3. 总结
我这里就不一 一列举了,只是做一个抛砖引玉的例子,希望大家可以自己去看 API 文档,仔细体会。其实,File 类没有想象中的那么难,虽然它抽象一点。它只是 Java 语言用来操作 Windows 系统上面的 文件/文件夹而已。加油!!
我这里有一个 JDK1.6 的中文文档,分享给大家哈:
链接:https://pan.baidu.com/s/1hrs68M_c0ioJ1dPAT1exSg
提取码:eldb
教程:
打开它,点击“搜索”一栏,然后输入自己想要查询类的 API
然后,回车
一定要找准此类所在的包,以免查询错误。找准后,双击“它”
点击上边栏的那个“类”,就能查询相关 API 啦
好啦,今天就分享到这啦